嵌入式专题研究1:USART和中断系统
USART通信
同步通信和异步通信:
同步通信:通信双方根据同步信号进行通信的方法。(spi和iic)
异步通信:依赖于双方彼此的独立时钟,约定好通信速度。(uart)
串行通信和并行通信:
串行通信:按位传输,同一时刻只能收或发1个bit的信息,只需要一根信号线。(USART、I2C、SPI)
并行通信:同一时刻可以收或发多个bit的信息,需要多根信号线。
单工,半双工,双工:
UART:全双工,TXD发送端,RXD接收端
SPI:全双工,SCK是同步时钟,MISO主机输入,从机输出,MOSI主机输出,从机输入
I2C:半双工,SCL同步时钟,SDA是数据输出/输入端
简介:
功能:用于打印调试信息,在电脑端的串口助手查看调试信息。专用的bug工具。
stm32f103c8t6的板子对应的USART信息。
通信协议的约定:
正常情况下TX和RX为高电平,起始位的标志为低电平。
LSB:低位先发送,约定好是8位还是9位,可选奇偶校验位,停止位1-2位(拉高1-2个高电平)。
8N1:8位数据位,不校验,1个停止位。
波特率:每秒传送的二进制位数。bps,衡量串行数据速度快慢的标志。
时钟配置:USART1在APB2时钟上,USART2等在APB1时钟上。
寄存器介绍:
控制寄存器USART_CR:数据位,停止位,奇偶校验
波特率寄存器USART_BRR
状态寄存器USART_SR:发送寄存器和接受寄存器的状态,发送是否完成
SR的低7位位TXE发送数据寄存器的状态,0表示数据还没有被转移到移位寄存器上,1表示数据已经转移到移位寄存器上了。
SR的低5位RXNE读数据寄存器的状态,0表示数据没有收到,1表示收到数据可以读出。
数据寄存器USART_DR
STM32实现串口数据的收发:
先用stm32官方的配置软件
void USART_Putchar(uint8_t ch){ while(!(USART1->SR&(1<<7))); //发送寄存器的状态 USART1->DR = ch; } uint8_t USART_Getchar(void){ while(!(USART1->SR&(1<<5))); //接收寄存器的状态 return USART1->DR; }
HAL库实现通信:实现fputc之后让printf变成调试利器。
HAL的发送函数:HAL_UART_Transmit()
HAL的接收函数:HAL_UART_Receive()
int fputc(int ch, FILE *p){ while(!(USART1->SR&(1<<7))); //发送寄存器的状态 USART1->DR = ch; return ch; }
中断系统
CPU在正常执行程序的过程中,遇到外部/内部的紧急事件需要处理,暂时中止当前程序的执行,转而去处理紧急的事件,待处理完毕之后再返回被打断的程序处进行往下执行。
轮询和中断处理:
轮询一直占据CPU,CPU效率不高
中断只有在接收到中断flag之后,CPU才会去处理,CPU效率比较高
中断处理的过程:
1.进入中断:保存现场到堆栈中
2.处理中断
3.退出中断
NVIC的主要功能:
1.中断管理
2.支持异常以及中断向量化处理
3. 支持嵌套中断处理
中断优先级寄存器和中断优先级管理
优先级越小,优先级越高
外部中断控制器EXTI:
SYSCFG_EXTICR1-4进行外部中断配置
软件中断|外部中断
按键中断实例:
key连入stm32的管脚,默认高电平,按下之后为低电平——>下降沿触发中断。
按键按下之后,触发中断,在中断服务程序中打印一段话。
我没带usb to ttl模块,因此换成了触发中断后修改LED的亮灭。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ switch(GPIO_Pin){ case SW1_Pin: HAL_Delay(20); if(HAL_GPIO_ReadPin(SW1_GPIO_Port,SW1_Pin) == 0){ //delay 20ms to determine wheather the key is push down. HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); } break; default: break; } }
串口中断实例:
同样修改中断callback函数
非常重要:当在keil中串口使用printf函数时出现程序卡死、运行部了的现象,是因为没使用use MicroLIB(微库)!!!
因为这个串口的实验均卡了2h以上,难绷。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!