用stm32F103核心板的GPIOA端一管脚接一个LED,GPIOB端口一引脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯。
采用串口中断方式重做上周的串口通信作业,分别实现:1)当stm32接收到字符“s”时,停止持续发送“hello windows!”; 当接收到字符“t”时,持续发送“hello windows!”(提示:采用一个全局标量做信号灯);2)当stm32接收到字符“stop stm32!”时,停止持续发送“hello windows!”; 当接收到字符“go stm32!”时,持续发送“hello windows!”(提示:要将接收到的连续字符保存到一个字符数组里,进行判别匹配。写一个接收字符串的函数。
STM32采用串口DMA方式,用115200bps或更高速率向上位机连续发送数据。
中断通常被定义为一个事件,该事件能够改变处理器执行指令的顺序。这样的事件与 CPU 芯片内外部硬件电路产生的电信号相对应。
中断是指计算机在执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的事件处理程序,待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。
中断分为同步中断和异步中断。
同步中断——同步中断是当指令执行时由 控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后 CPU 才会发出中断
异步中断——异步中断是由其他硬件设备依照 CPU 时钟信号随机产生的。
通常我们所说的中断指的是异步中断,我们将同步中断称为异常。(异常是由程序的错误产生的,或者是由内核必须处理的异常条件产生的)
多个中断同时出现时,处理器先响应高优先级的中断
低优先级中断的ISR执行时,可以被高优先级中断再次打断
ISR比App Code拥有更高的执行优先级
中断的类型
硬中断:通过处理器中断信号线产生的中断
软中断:通过非法指令或特殊指令触发的中断
用stm32F103核心板的GPIOA端一管脚接一个LED,GPIOB端口一引脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯。
此文章选用的核心板为STM32F103C8T6最小核心板
设置PA1端接开关,PB5接LED
对于按键电路,设置上拉式按键
按键按下,引脚PA1读到低电平
按键释放,引脚PA1读到高电平
LED灯的触发方式
按键按下瞬间,形成下降沿
按键释放瞬间,形成上升沿
因此这里设置上升沿触发,即松开按键时灯亮,因为题目要求为开关接高高电平亮灯。
管脚定义界面
设置指示灯LED引脚PB5,设置引脚模式为输出模式GPIO_Output
设置按键引脚PA1,设置引脚为外部中断功能,PA1与外部中断线EXIT1连接GPIO_EXIT1
PB5保持默认设置,命名为LEDPA1触发方式为上升沿触发,命名为 A1_EXTI使能对应外部中断线
配置中断优先级
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
当捕获到上升沿,触发中断,就会进入到这个函数里面
然后就会执行HAL_GPIO_EXTI_Callback(GPIO_Pin)函数,此函数为回调函数,我们打开可以发现前面有个weak。
前面的 __weak 表示此函数为虚函数,需要用户重写的。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if( GPIO_Pin == A1_EXTI_Pin)//判断外部中断源
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);//翻转LED状态
}
}
USB TO TTL——STM32F103
3V3——3V3
GND——GND
TXD——A10
RXD——A9
STM32F103 ——LED
3.3——LED长脚
B5——LED短脚
A1——3V3——亮灯
A1——GND——熄灯
面包板地接STM32地
LED
char c;//指令 s:停止 t:开始
char message[]="hello Windows\n";//输出信息
char tips[]="CommandError\n";//提示1
char tips1[]="Start.....\n";//提示2
char tips2[]="Stop......\n";//提示3
int flag=0;//标志 s:停止发送 t:开始发送
2.main函数中设置接收中断
HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
if(flag==1){
//发送信息
HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message),0xFFFF);
//延时
HAL_Delay(1000);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
//当输入的指令为s时,发送提示并改变flag
if(c=='s'){
flag=0;
HAL_UART_Transmit(&huart1, (uint8_t *)&tips2, strlen(tips2),0xFFFF);
}
//当输入的指令为t时,发送提示并改变flag
else if(c=='t'){
flag=1;
HAL_UART_Transmit(&huart1, (uint8_t *)&tips1, strlen(tips1),0xFFFF);
}
//当输入不存在指令时,发送提示并改变flag
else {
flag=0;
HAL_UART_Transmit(&huart1, (uint8_t *)&tips, strlen(tips),0xFFFF);
}
//重新设置中断
HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
}
USB TO TTL——STM32F103
3V3——3V3
GND——GND
TXD——A10
打开野火串口助手,选择com5
串口通信
直接存储器访问 (DMA)
DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。
DMA传输过程的初始化和启动由CPU完成,传输过程由DMA控制器来执行,无需CPU参与,从而节省CPU资源,提高利用率。
设置RCC
设置串口USART1
使能中断
设置DMA
点击DMA Settings的Add添加通道,传输速率设置为中速Medium
模式设置为Normal,右侧选择Memory
在System view下选择DMA
设置时钟
打开上部生成的文件
在main中添加代码
uint8_t Senbuff[] = "Hello windows"; //定义数据发送数组
在while中添加代码
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));
HAL_Delay(1000);
本文章介绍中断及DMA 简单概念,实现了LED 的控制和两类串口通信方式,此次实验对现阶段的我还存在难度,需要参考大量资料,实现结果也有所偏差。
https://blog.csdn.net/weixin_46129506/article/details/121164797?spm=1001.2014.3001.5502
https://blog.csdn.net/qq_46467126/article/details/121076618?spm=1001.2014.3001.5502
https://blog.csdn.net/qq_46467126/article/details/121055475?spm=1001.2014.3001.5502
https://mooc1.chaoxing.com/ueditorupload/read?objectId=38f0edb7f0eeac3b7ebc6a7100d536b7&fileOriName=%25E7%25AC%25AC%25E4%25B8%2583%25E7%25AB%25A0__%25E4%25B8%25AD%25E6%2596%25AD%25E7%25B3%25BB%25E7%25BB%259F(new).pdf
https://mooc1.chaoxing.com/ueditorupload/read?objectId=05868bc268f33bd95dd854dbdaf4cd23&fileOriName=%25E7%25AC%25AC%25E4%25B9%259D%25E7%25AB%25A0__%25E4%25B8%25B2%25E5%258F%25A3%25E9%2580%259A%25E4%25BF%25A1(new).pdf