我的学习之路_stm32f103c8t6_Day8

187 阅读3分钟

常见的Debug方法

  1. 硬件调试

    通过LED灯显示当前的状态

  2. 打印调试

    通过串口通信的方式去打印运行的状态或者位置

  3. 调试器调试

    利用调试器打断点检测问题

UART通讯

通信分类概览
  • 串行通信 两根通讯线通信 只能一位一位通信
  • 并行通信 多根数据线通信 可以一次发送一个字节(8bit)
  • 全双工 同时收发信息
  • 半双工 收发非同时
  • 单工 只能单向通信
  • 同步 有时钟线 利用时钟信号确定速率
  • 异步 无时钟线 提前说明速率
通信速率
  • 比特率 bit/s 8bit = 1B(字节)
  • 波特率 baud/s 1baud可包含多个bit

UART通用异步收发器

STM32的UART接口最多有五个信号

  • TX 发送
  • RX 读取
  • nCTS 允许发送
  • nRTS 请求发送
  • SCLk 时钟

一般只用 TX RX

TTL接口标准

2.45V 逻辑1 00.5V 逻辑0

RS232接口标准 抗干扰强点 1对1

-15~-3V 逻辑1 3~15V 逻辑0

RS485接口标准 1对多

逻辑1:+2V–+6V 逻辑0:-6V—2V

协议

波特率:bit/s

起始位:逻辑0 数据位:bit0 - bit7 校验位:奇偶校验位(可选) 停止位:0.5、1、1.5、2个逻辑1

stm32CubeMx配置说明

image.png

Asynchronous:异步通信 Sysnchronous:同步通信 IrDA:红外线通信 LIN:总线 SmartCard:智能卡

选择异步通信

image.png

配置参数如上图所示

USART寄存器以及HAL库的函数介绍

USART_SR Status register CTS:CTS信号线 LBD:LIN检测信号 TXE:传输数据寄存器为空 TC:传输完成 RXNE:读取数据寄存器有数据 IDLE:IDLE信号线 ORE:溢出错误 NE:噪声错误 FE:框架错误 PE:校验错误 USART_DR 数据区 USART_BRR 波特率设置 USART_CR1 UE:使能 M:字长 0:8位 1:9位 WAKE:唤醒方式 PCE:奇偶校验的使能 PS:0偶校验 1奇校验 PEIE:PE中断使能 TXIE:发送缓冲区中断 TXE==1 发生中断 TCIE:TC == 1 RXNEIE:RXNE == 1 IDLEIE:IDLE == 1 TE:发送使能 RE:接收使能 RWU:接收唤醒 SBK:发送断开 USART_CR2 LINEN:Lin模式使能 STOP:00 01 10 11 1 0.5 2 1.5 个停止位 CLKEN:时钟使能 CPOL:时钟极性 空闲时 时钟线为高还是低 CPHA:时钟相位 上升沿采集信号 下降沿采集信号 LBCL:最后一位时钟脉冲 LBDIE:断开检测中断使能 LBDL:断开检测长度 ADD:USART结点地址 USART_CR3 CTSIE:CTS中断使能 CTSE:CTS使能 RTSE:RTS使能 DMAT:DMA使能发送 DMAR:DMA使能接收 SCEN:智能卡模式 NACK:智能卡NACK使能 HDSEL:半双工模式 IRLP:红外低功耗 IREN:红外模式使能 EIE:错误中断使能 USART_GTPR 保护时间和预分频寄存器

常用的HAL函数

  • 初始化
    • HAL_UART_Init()
    • HAL_UART_MspInit() 在HAL_UART_Init()中调用 实现GPIO及中断设置
  • 初始化和总体功能
    • HAL_UART_GetState() 获取状态
    • HAL_UART_GetError() 获取错误
  • 阻塞传输
    • HAL_UART_Transmit() 阻塞发送
    • HAL_UART_Receive() 阻塞接收
  • 中断传输
    • HAL_UART_Transmit_IT() 中断方式发送
    • HAL_UART_Receive_IT() 中断方式接收
  • DMA传输
    • HAL_UART_Transmit_DMA() DMA发送一个数据区
    • HAL_UART_Receive_DMA() DMA接收一个数据区
    • HAL_UART_DMAPause() DMA传输暂停
    • HAL_UART_DMAResume() DMA传输继续
    • HAL_UART_DMAStop() 停止DMA传输过程
  • 取消数据传输
    • HAL_UART_Abort() 终止以中断方式和DMA方式的启动传输
    • HAL_UART_AbortTeansmit()
    • HAL_UART_AbortReceive()
    • HAL_UART_Abort_IT()
    • HAL_UART_AbortTeansmit_IT()
    • HAL_UART_AbortReceive_IT()
  • 宏函数
    • __HAL_UART_ENABLE() 使能通信
    • __HAL_UART_DISENABLE() 使能通信
    • __HAL_UART_ENABLE_IT() 使能中断
    • __HAL_UART_DISENABLE_IT() 失能中断
    • __HAL_UART_GET_IT_SOURCE() 检测某个事件是否被允许产生硬件中断
    • __HAL_UART_GET_FLAG() 获取状态
    • __HAL_UART_CLEAR_FLAG() 清空状态
  • 中断
    • UART_IT_CTS
    • UART_IT_LBD
    • UART_IT_TXE
    • UART_IT_TC
    • UART_IT_RXNE
    • UART_IT_IDLE
    • UART_IT_PE
    • UART_IT_ERR

代码片段

int fputc(int ch,FILE *f)
{
    HAL_UART_Transmit(&huart2,(uint8_t *)&ch,1,10000);
    return ch;
}

int fgetc(FILE *f)
{
    int ch = 0;
    HAL_UART_Receive(&huart2,(uint8_t *)&ch,1,10000);
    return ch;
}

void Usart2_SendString(uint8_t *str)
{
    unsigned int k = 0;
    do{
        HAL_UART_Transmit(&huart2,(uint8_t *)(str+k),1,10000);
        k++;
    }while(*(str+k)!='\0');
}

__HAL_UART_ENABLE_IT(uartHandle,UART_IT_RXNE); //这个必须有啊  只有使能里面的中断事件才能进中断函数判断哪个事件