UART驱动过程

URAT工作流程:
1.配置发送和接收口线信息来实现访问方式 
  具体使用IO的端口及读写方式即配置GPIOx的PC0 PC1 PC2寄存器
2.开启UART_CR中的RUN位打开波特率发生器使UART激活
3.配置队列机制这个机制是接收和发送公用的配置 
  选择关闭队列机制即不使用FIFO中的其他15个数据矢能 
  选择开启队列机制则使用16个数据矢能在移位前可以存储16字节发送或接收数据
  操作置或者清除UARTn_CR.Fifo Enable位来实现
4.清空队列两个接收和发送队列。
  写UARTn_TxRSTR 和 UARTn_RxRSTR寄存器0xFFFF来实现
5.配置UART传输模式 
  关闭LoopBack位,置零使用正常发送和接收模式[LoopBack功能不详]
6.配置数据传输的属性包括发送模式,波特率设置,奇偶校验设置,停止位设置
  发送模式配置UARTn_Mode[1.0]来配置7位8位+校验等设置
  波特率设置:设置波特率UART_BR按照计算公式PCLK2/(16*设置波特率)
  奇偶检验设置: 设置UART_CR.ParityOdd为1或者0来表示奇或者偶 
  停止位设置: UART_CR.StopBits[3.4]检测停止位 
  以上配置信息均由ARM硬件封装完成和51自行检测不同  
7.配置发送缓存为空的检测周期,用于产生TxEmpty标志及必要的中断
  UART_GTR.GuardTime[7.0]:装载检测周期数目。  
8.配置超时时间寄存器 用于产生TimeOut及必要的中断
  UART_TOR.TimeOut[7.0]:确保在完成接收两个字节数据的间隔不超过此时间
9.配置接收允许位 
  UART_CR.RxEnable来允许或者禁止接收功能
到此UART本身的基本配置已经完成
实现接受和发送功能
1.非中断采用轮寻发送接受标志位来实现
  实现过程不需要配置相应UART中断的优先级及中断向量任何与UART有关的中断信息
  连续发送数据只要判当年的FIFO属性来决定相关装入的时序。
  关闭FIFO则轮寻TxEmpty为空装入,开启队列则轮寻队列不满时装入数据
  接收由于不使用中断必须死循环轮寻接收队列不为空标志位有数据则读入
优缺点:似乎没有什么好处这种方法用出来不死机已经大幸了,除非只是等待接受数据业务
       否则这种方法不可取。
2.中断则使用触发UART中断分派UART相应具体中断消息分别处理
  需要设置EIC相应内容
  a.设置当前中断向量优先级配置EIC_SIR[向量]的私有优先级信息
  b.开启EIC中UART中断允许位设置EIC_IER0中断相应向量的位
  c.设置具体UART触发中断的具体标志位 
    比如配置接收中断位,则配置UARTn_IER.NotEmptyIE位
    表示一旦接收队列有数据产生UARTn的中断。使用某一功能时只开其中一个中断位
    以防止在产生中断时无法准确分派相应中断消息。
    同样可以配置发送完成,接收超时等具体使用时有实际用处的中断来使用。
优缺点:这样不需要同步操作,CPU可以得到更多的空闲时间在执行其他操作
       只要在完成一次发送或者接收或者其他操作时在中断时处理,继续执行主程序。
       程序不用等待可以异步进行。很实用通用的做法。
       
PS:另外在程序运行使用UART时需要通过RCCU来配置主频外设一 外设二的频率
   其程序及UART波特率发生才能工作。

你可能感兴趣的:(UART学习)