文章目录[隐藏]
目录
一、HAL库中断点亮LED灯
1.建项目部分
1.新建项目
file->new project
2.选择芯片
选择STM32F103C8
3.找到PA9,选择为GPIO——EXTI5中断模式
4.选择PA1设置为GPIO_Output
输出模式
5.设置引脚
PA1设置high
6.设置RCC和SYS
7,设置开启中断
8.设置时钟树
9.项目命名,然后生成项目
2、代码部分
在main.c添加
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/* Prevent unused argument(s) compilation warning */
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1); //翻转电平
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_GPIO_EXTI_Callback could be implemented in the user file
*/
}
3.运行结果
二、HAL库中断串口通信
1.项目
1.新建项目并设置usart1
设置sys和rcc(与以上一样)
2. 设置USART1使能中断
3.重复设置时钟树,项目命名。然后生成项目
2.代码部分
1.在main.c代码中添加
#define LENGTH 10 // 接收缓冲区大小
//定义缓冲区和标志位
uint8_t RxBuffer[LENGTH]; // 接收缓冲区
uint8_t Rxflag = 0; // 标志位,0为接收未完成,1为接
HAL_UART_Receive_IT(&huart1, (uint8_t*)RxBuffer, LENGTH); // 使能接收中断
char data[] = "\nSuccess\n"; // 接收成功信息
2.在while中添加
if (Rxflag == 1){ // 若数据接收完成
Rxflag = 0; // 清除标志位
HAL_UART_Transmit(&huart1, (uint8_t *)data, 18, 0xFFFF); // 接收成功信息
// 发送接收到的字符
HAL_UART_Transmit_IT(&huart1, (uint8_t*)RxBuffer, LENGTH);
}
3.在main.c中定义回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
if (huart->Instance == USART1){
Rxflag = 1; // 设置标志位为1
HAL_UART_Receive_IT(&huart1, (uint8_t*)&RxBuffer, LENGTH); // 使能接收中断
}
}
4.烧录
结果
三、采用串口DMA发送用特定速率向上位机连续发送数据
1.项目
1.创建项目
RCC配置时钟和SYS配置,时钟树,usart1设置步骤同上
2.使能中断
3.生成文件如上
2.代码
1.在while循环中添加
uint8_t data[] = "HELLO\r\n";
HAL_UART_Transmit_DMA(&huart1,(uint8_t *)data,30);
HAL_Delay(1000); //
2.生成hex
3.烧录及结果
结果
总结:
我明白了STM32的中断有两种优先级即抢占式优先级 和响应式优先级。抢占式优先级的具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应也就是中断嵌套。而响应式优先级的特点是当两个中断源的抢占式优先级相同时,高响应优先级的中断优先被响应,这两个中断将没有嵌套关系以及当两个中断源的抢占式优先级.
参考文献:
STM32之中断方式实现串口通信_Baker的博客-CSDN博客
STM32之中断控制LED灯_Baker的博客-CSDN博客
【STM32开发】STM32外部中断 - 知乎 (zhihu.com)
版权声明:本文为CSDN博主「m0_61811389」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_61811389/article/details/121214920
暂无评论