一般用STM32CUBE生成,用户只需要会用STM32CUBE就行。
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOF_CLK_ENABLE(); //打开GPIO时钟
GPIO_InitStruct.Pin = GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //输出模式
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); //初始化GPIO
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_7, GPIO_PIN_SET); //拉高GPIO
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_7, GPIO_PIN_RESET); //拉低GPIO
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_7); //翻转GPIO
}
void Key_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
__HAL_RCC_GPIOA_CLK_ENABLE(); //打开GPIO时钟
GPIO_InitStructure.Pin = GPIO_PIN_A;
GPIO_InitStructure.Mode = GPIO_MODE_INPUT; //输入模式
GPIO_InitStructure.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIO
HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1); //读取GPIO电平
}
void EXTI_Key_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
__HAL_RCC_GPIOA_CLK_ENABLE(); //打开GPIO时钟
GPIO_InitStructure.Pin = GPIO_PIN_1;
GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING; //中断、上升沿模式
GPIO_InitStructure.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIO
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); //配置EXTI0中断源 到PA0引脚、配置中断优先级
HAL_NVIC_EnableIRQ(EXTI0_IRQn); //使能中断
}
void EXTI0_IRQHandler(void) //中断处理函数
{
if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0) != RESET) //获取中断源
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0); //清除中断源
}
}
HAL_SYSTICK_Config(SystemCoreClock / 1000); //1ms中断一次
/* 该函数会自动帮我们打开系统嘀嗒中断,设置好中断优先级,并打开定时器 */
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE(); //打开GPIO时钟
__HAL_RCC_USART1_CLK_ENABLE(); //打开串口外设时钟
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //配置Tx引脚为复用功能
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1; //配置Rx引脚为复用功能
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_NVIC_SetPriority(USART1_IRQn,0,1); //抢占优先级0,子优先级1
HAL_NVIC_EnableIRQ(USART1_IRQn); //使能USART1中断通道
}
UART_HandleTypeDef UartHandle;
void DEBUG_USART_Config(void)
{
UartHandle.Instance = USART1;
UartHandle.Init.BaudRate = 115200;
UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
UartHandle.Init.StopBits = UART_STOPBITS_1;
UartHandle.Init.Parity = UART_PARITY_NONE;
UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
UartHandle.Init.Mode = UART_MODE_TX_RX;
HAL_UART_Init(&UartHandle); //初始化串口:该函数会回调HAL_UART_MspInit
__HAL_UART_ENABLE_IT(&UartHandle,UART_IT_RXNE); //使能串口接收断
}
void USART1_Send_Data(uint8_t *buffer, uint16_t len) //发送数据
{
HAL_UART_Transmit(&UartHandle,(uint8_t *)(buffer), len, 1000);
}
void USART1_IRQHandler(void) //中断接收数据
{
uint8_t ch;
if(__HAL_UART_GET_FLAG( &UartHandle, UART_FLAG_RXNE ) != RESET)
{
ch = (uint16_t)READ_REG(UartHandle.Instance->DR);
}
}
TIM_HandleTypeDef htim6;
uint32_t delay_ms_timer;
void HAL_TIM6_Init(void)
{
__HAL_RCC_TIM6_CLK_ENABLE(); //定时器时钟使能
htim6.Instance = TIM6;
htim6.Init.Prescaler = 71; //72分频:定时器计数时钟为1MHz,也就是1us
htim6.Init.Period = 1000; //1000*1us,定时时间为1ms
HAL_TIM_Base_Init(&htim6); //初始化定时器
HAL_NVIC_SetPriority(TIM6_IRQn, 1, 0); //设置定时器中断优先级
HAL_NVIC_EnableIRQ(TIM6_IRQn); //使能定时器中断
HAL_TIM_Base_Start_IT(&htimx); //打开定时器
}
void delay_ms(uint32_t ms)
{
delay_ms_timer = ms;
while(delay_ms_timer > 0);
}
void TIM6_IRQHandler(void)
{
if (__HAL_TIM_GET_FLAG(htim6, TIM_FLAG_UPDATE) != RESET) //如果是更新中断
{
if (__HAL_TIM_GET_IT_SOURCE(htim6, TIM_IT_UPDATE) != RESET) //如果更新中断被打开
{
__HAL_TIM_CLEAR_IT(htim6, TIM_IT_UPDATE); //清除更新中断
if( delay_ms_timer > 0 )
delay_ms_timer--;
}
}
}