STM32CubeMX——HAL库之中断
- 硬件准备:正点原子的F407探索者开发板一块、ST-Link下载器一个
- 参考文档:《正点原子的HAL库系列教程》
1 GPIO中断
1.1 打开STM32CubeMX生成keil5工程
-
选择单片机型号
-
配置下载方式
-
配置时钟源
-
配置时钟树
-
配置调试串口1
-
配置按键引脚
-
配置NVIC中断优先级
-
生成工程配置
1.2 在keil5中编写代码
- 在 main.h中添加 #include <stdio.h>
- 在 main.c中添加以下代码
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
printf("Begin GPIO-EXTI Test \r\n"); //添加串口调试打印代码
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
- 在 usart.c中添加 printf重定向函数
/* USER CODE BEGIN 0 */
int fputc(int ch, FILE *h)
{
HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END 0 */
- 在 gpio.c中添加回调函数代码
/* USER CODE BEGIN 2 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
HAL_Delay(100);
switch(GPIO_Pin)
{
case GPIO_PIN_2:
if(HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == RESET)
{
printf("HAL_GPIO_EXTI_Callback-> GPIO_PIN_2\r\n");
break;
}
case GPIO_PIN_3:
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == RESET)
{
for(uint8_t i=0; i<10; i++)
{
printf("HAL_GPIO_EXTI_Callback-> GPIO_PIN_3 [%d]\r\n",i);
HAL_Delay(500);
}
break;
}
case GPIO_PIN_4:
if(HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == RESET)
{
printf("HAL_GPIO_EXTI_Callback-> GPIO_PIN_4\r\n");
break;
}
default:
break;
}
/*总结:当抢占优先级为2的中断在执行循环语句时,
此时被抢占优先级为1的中断打断,
去执行优先级为1的任务,
当抢占优先级为1的任务执行完毕后,又继续执行抢占优先级为2的任务
直到抢占优先级为2的任务执行完毕*/
}
1.3 串口打印显示结果
2 串口中断接收和发送定长数据
1.1 打开STM32CubeMX生成keil5工程
-
选择单片机型号
-
配置下载方式
-
配置时钟源
-
配置时钟树
-
配置串口1及串口1的中断配置
-
配置NVIC中断优先级
-
生成工程配置
1.2 在keil5中编写代码
- 在 usart.c中添加中断回调函数
/* USER CODE BEGIN 1 */
extern uint8_t recv_buf[20];
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
HAL_UART_Transmit_IT(&huart1,(uint8_t *)recv_buf,10);
HAL_UART_Receive_IT(&huart1,(uint8_t *)recv_buf,10);
}
}
/* USER CODE END 1 */
- 在 main.c中添加 接收数据的 recv_buff
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint8_t recv_buf[20] = {0};
/* USER CODE END 0 */
- 在 main.c中添加 打开串口接收中断
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1,(uint8_t *)recv_buf,10);
/* USER CODE END 2 */
1.3 串口打印显示结果
3 定时器——每秒产生一次中断
1.1 打开STM32CubeMX生成keil5工程
-
选择单片机型号
-
配置下载方式
-
配置时钟源
-
配置时钟树
-
配置调试串口1
-
配置定时器及定时器中断
参照数据手册中的系统架构图,TIM3内部时钟来源是APB2 = 84Mhz,想要得到每秒产生一次中断,所以预分频系数设置为84000-1,自动重载值为1000-1,得到的计时器更新中断频率即为84000000/8400/10000=1Hz。
7. 配置NVIC中断优先级
8. 生成工程配置
1.2 在keil5中编写代码
1.3 串口打印显示结果
版权声明:本文为qq_45661238原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。