原创 STM32 UART的使用过程

2010-3-30 11:39 6921 7 8 分类: MCU/ 嵌入式
       1、使用UART前必须启动相应的外设时钟,其主要用到固件库的RCC_APBnPeriphClockCmd函数。
使能UART1:使用RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE)
使能UART2:使用RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 , ENABLE)
2、使用中断进行UART操作的需要配置NVIC,设置中断优先级。如:
 /* Configure the NVIC Preemption Priority Bits */
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

 /* Enable the USART1 Interrupt */
 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 NVIC_Init(&NVIC_InitStructure);

3、配置相应的GPIO口。
 如果系统的UART需要进行重映射,需要使用GPIO_PinRemapConfig函数进行重映射,如:GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//注意:Rx为浮空,Tx为第二功能上拉。
 将Rx配置为:浮空输入模式,Tx配置为带上拉的第二功模式。并用GPIO_Init() 函数初始化。如:
 /* Configure USART2 Rx PA3 input floating */
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
 GPIO_Init(GPIOA, &GPIO_InitStructure);

 /* Configure USART1 Tx (PA.09) as alternate push-pull */
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
 GPIO_Init(GPIOA, &GPIO_InitStructure);
4、配置UART
 当在conf文件种配置正确的外晶振后,在USART_InitTypeDef定义的结构体种直接写入UART的波特率、通讯长顿、模式、硬件通讯控制,收发模式。再用USART_Init()进行初始化。如:
 USART_InitStructure.USART_BaudRate = 9600;
 USART_InitStructure.USART_WordLength = USART_WordLength_8b;
 USART_InitStructure.USART_StopBits = USART_StopBits_1;
 USART_InitStructure.USART_Parity = USART_Parity_No;
 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

 /* Configure USART1 */
 USART_Init(USART1, &USART_InitStructure);

 而后使能收发中断。如:
 /* Enable USART1 Receive and Transmit interrupts */
 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
 USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
// USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
 注意:一般不将TXE中断使能。因为一旦将此中断使能,如果UART发送缓冲区空,则会立即进入UART中断中,因此可在程序中需要发送数据处,使能TXE中断。在UART中断种用USART_SendData()来发送数据。
 完成中断使能后,还需要使能UART口:
 如:
 /* Enable the USART1 */
 USART_Cmd(USART1, ENABLE);
 /* Enable the USART2 */
 USART_Cmd(USART2, ENABLE);

中断程序(stm32f10x_it.c)可以如下完成发送:注意所有的的串口中断需要在中断服务程序中判断中断源以分别处理。
void USART1_IRQHandler(void)
{
 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
 {
 /* Read one byte from the receive data register */
 RxBuffer1[RxCounter1++] = USART_ReceiveData(USART1);
 if(RxCounter1 == NbrOfDataToRead1)
 {
 USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);//发送完成后,将RXNE禁止。
 }
 }

 if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
 {
 USART_SendData(USART1, TxBuffer1[TxCounter1++]);
 if(TxCounter1 == NbrOfDataToTransfer1)
 {
 USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
 }
 }
}
PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户380277 2011-9-23 01:24

今晚在调串口程序时,一直感觉郁闷,程序不停地进串口中断,搞了半天,也没有找到原因,突然看到您写的文章,感觉茅塞顿开,谢谢
相关推荐阅读
用户89529 2010-09-25 17:03
stm32 malloc:动态分配内存函数
函数原型:void *malloc(unsigned size)头文件:#include<stdlib.h>是否是标准函数:是函数功能:动态分配一块内存空间,size为指定的分配空间的大小...
用户89529 2010-08-09 14:13
SD卡的读写和FatFS文件系统
因为要用,学习了一下SPI操作SD卡,同时移植了一个免费开源的FAT文件系统:FatFS。感觉挺好,在单片机上实现了读写文件的操作,接下来就可以解释我的G代码咯!  我的SD卡底层操作参考了网上几种常...
用户89529 2010-08-09 14:11
转一篇比较详细介绍FatFs文件系统移植的文章
FatFs文件系统的移植    因为需要,又不想自己写,所以就移植了一个文件系统。    说下我的硬件和开发工具:接成 TRUE IDE 模式下的CF卡(也就是相当于一块硬盘了),三星S3C2440的...
用户89529 2010-08-05 11:53
关于STM32的systick定时器的详细说明
我不得不说意法半导体确实有点风骚!甚至有点变态。我对ST文档 STM32F10XXX参考手册的编辑水平真是不敢恭维。手册中好多说明都是含糊不清,甚至将好多对初学者来说很重要的地方都一笔带过,让人着实摸...
用户89529 2010-05-11 19:40
stm32 fsmc数据地址线的关系
      stm32的fsmc接口设置的资料很少,所以现在对各个寄存器的具体应用还不是很明白,最近写了一个程序是把以前8位数据线读写sram的程序,改为16位数据线。有了一个小小的发现,现在把它写出...
用户89529 2010-05-07 11:59
stm32关于BOOT0和BOOT1
BOOT0和BOOT1STM32三种启动模式对应的存储介质均是芯片内置的,它们是:1)用户闪存 = 芯片内置的Flash。2)SRAM = 芯片内置的RAM区,就是内存啦。3)系统存储器 = 芯片内部...
EE直播间
更多
我要评论
1
7
关闭 站长推荐上一条 /3 下一条