STM32F407之USART

来源:互联网 发布:淘宝手机设置优惠券 编辑:程序博客网 时间:2024/05/16 23:43

        STM32F407xx内嵌四个通用同步/异步接收器​​(USART1,USART2,USART3和USART6)和两个通用异步收发器(UART4和UART5)。这6个接口提供异步通信的IrDASIR ENDEC支持,多机通信模式,单线半双工通信模式LIN主/从功能。 USART1和USART6接口能够速度高达10.5 Mbit / s的通信其他可用的接口通信高达5.25bit/s。USART1,USART2,USART3和USART6还提供硬件管理的CTS,RTS信号,智能卡的模式(ISO7816兼容)和类似的SPI通信能力。所有接口都可以通过DMA控制器。

USART name

Standard features

Modem (RTS/CTS)

LIN

SPI master

irDA

Smartcard (ISO 7816)

Max. baud rate in Mbit/s (oversampling by 16)

Max. baud rate in Mbit/s (oversampling by 8)

APB mapping

USART1

X

X

X

X

X

X

5.25

10.5

APB2 (max. 84 MHz)

USART2

X

X

X

X

X

X

2.62

5.25

APB1 (max. 42 MHz)

USART3

X

X

X

X

X

X

2.62

5.25

APB1 (max. 42 MHz)

UART4

X

-

X

-

X

-

2.62

5.25

APB1 (max. 42 MHz)

UART5

X

-

X

-

X

-

2.62

5.25

APB1 (max. 42 MHz)

USART6

X

X

X

X

X

X

5.25

10.5

APB2 (max. 84 MHz)

 

这里只介绍两根线的最简单串口设置。

 

 波特率的计算:

         USART用的波特率是由APB时钟线和波特率寄存器USART_BRR确定的,USART_BRR为32位寄存器,其中高16位保留,低十六位确定波特率,低16位又分为[15:4]和[3:0]或[15:4]和[2:0],具体分法由OVER8决定,[15:4]存放USARTDIV的整数部分,小数部分由[3:0]或[2:0]存放。



小数部分USARTDIV的小数部分乘以16或8,结果保留整数存于USART_BRR[3:0]或[2:0]中

 

比如:要求波特率为115200


 

设置OVER8=0

解得:USARTDIV=22.768

USART_BRR[15:4]=22=0x16

USART_BRR[3:0]=0.768*16=13=0xC

USART_BRR=0x0000016C

 

 

 

 

设置步骤:

1.     设置中断优先级分组(如果之前没有设置),这个最好一个程序里只在开头设置一次。

2.     使能相关时钟。

3.     设置波特率。

4.     设置控制寄存器CR。

5.     选择相关GPIO引脚的复用功能。

6.     设置相关GPIO引脚为复用模式。

7.     设置相关GPIO引脚的速度,方式。

8.     如果要用到中断,设置USART中断优先级。

9.     如果要用到中断,使能USART中断。

10.  如果要用中断,编写中断服务函数(函数名是固定的)。

11.  中断服务函数里检查是哪个中断。

12.  编写相应服务程序。

 

 

电路参见本博客:小工具之——max232电平转换


程序:

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /*********************************************  
  2.     标题:操作USART的练习  
  3.     软件平台:IAR for ARM6.21  
  4.     硬件平台:stm32f4-discovery  
  5.     主频:168M  
  6.       
  7.     描述:从其他设备接收数据,再把数据发送出去  
  8.   
  9.     author:小船  
  10.     data:2012-02-01  
  11. **********************************************/  
  12.   
  13. #include <stm32f4xx.h>   
  14.   
  15. u32 Gb_TimingDelay;  
  16.   
  17. u8 suffer[100];  
  18. u8 ok_to_send;  
  19. u8 Rx_data_counter;  
  20.   
  21. void Delay(uint32_t nTime);  
  22.   
  23. void main ()  
  24. {   
  25.     
  26.   char Tx_data_counter;  
  27.     
  28.   SCB->AIRCR = 0x05FA0000 | 0x400;  //中断优先级分组 抢占:响应=3:1  
  29.   SysTick_Config(SystemCoreClock / 1000); //设置systemtick一毫秒中断  
  30.     
  31.   RCC->AHB1ENR |= 0x00000008; //使能GPIOD时钟  
  32.   RCC->APB1ENR |= (1<<18);  //使能usart3时钟  
  33.     
  34.   USART3->BRR = 0x0000016C;   //波特率115200  
  35.    
  36.   /*  
  37.   使能usart3  
  38.   usart3发送使能  
  39.   usart3接收使能  
  40.   接收缓冲区非空中断使能  
  41.   8bit  
  42.   一位停止位  
  43.   无校验  
  44.   */  
  45.   USART3->CR1 |= (( 1<<13 ) | ( 1<<3 ) | ( 1<<2 ) | ( 1<<5 ));   
  46.     
  47.   GPIOD->AFR[1] |= 0x00000077;//选择PD8,9复用功能   
  48.     
  49.   GPIOD->MODER &= 0xFFF0FFFF; //设置PD8,9,复用模式  
  50.   GPIOD->MODER |= 0x000A0000;   
  51.     
  52. //  GPIOD->OTYPER &= 0xFFFFDFFF; //设置PD9推挽输出  
  53.     
  54.   GPIOD->OSPEEDR &= 0xFFFCFFFF; //PD8速度50m  
  55.   GPIOD->OSPEEDR |= 0x00020000;  
  56.     
  57.   GPIOD->PUPDR &= 0xFFFCFFFF; //PD8  
  58.   GPIOD->PUPDR |= 0x00010000;  
  59.     
  60.   NVIC->IP[39] = 0xf0; //最低抢占优先级,最低响应优先级1111  
  61.   NVIC->ISER[1] |= (1<<(39-32)); //使能中断线39,也就是usart3中断  
  62.     
  63.   while(1)  
  64.   {    
  65.     if(ok_to_send)  //接收到数据,可以将数据发送  
  66.     {  
  67.       if((USART3->SR & (1<<7))) //发送数据寄存器空  
  68.       {  
  69.         USART3->DR = suffer[Tx_data_counter];  
  70.         Tx_data_counter++;  
  71.         if( suffer[Tx_data_counter] == '\r' )  
  72.         {  
  73.           Tx_data_counter = 0;  
  74.           USART3->CR1 |= 1<<5;  //使能接收中断  
  75.           ok_to_send = 0;  
  76.         }   
  77.       }   
  78.     }  
  79.   }  
  80. }  
  81.   
  82.   
  83. void Delay(uint32_t nTime)  
  84. {   
  85.   Gb_TimingDelay = nTime;  
  86.   
  87.   while(Gb_TimingDelay != 0);  
  88. }  
  89.   
  90. void SysTick_Handler(void)  
  91. {  
  92.   if (Gb_TimingDelay != 0x00)  
  93.   {   
  94.     Gb_TimingDelay--;  
  95.   }  
  96. }  
  97.   
  98. void USART3_IRQHandler(void)  
  99. {  
  100.   if(USART3->SR & (1<<5)) //接收数据寄存器非空  
  101.   {  
  102.     suffer[Rx_data_counter] = USART3->DR;  
  103.     Rx_data_counter++;  
  104.     if(suffer[Rx_data_counter - 1] == '\r')  
  105.     {  
  106.       Rx_data_counter = 0;  
  107.       USART3->CR1 &= ~(1<<5); //除能接收中断  
  108.       ok_to_send = 1;  
  109.     }  
  110.    }   
  111. }  

运行结果:

0 0
原创粉丝点击