嵌入式专题研究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以上,难绷。

 
posted @   zxkic  阅读(74)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示