OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11201|回复: 5

STM32 UART的使用过程

[复制链接]

38

主题

292

帖子

1

精华

高级会员

Rank: 4

积分
614
金钱
614
注册时间
2012-7-6
在线时间
0 小时
发表于 2013-1-10 09:52:13 | 显示全部楼层 |阅读模式
 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);
}
}
}
STM32F3系列公司现有货供应!STM32F0,STM32F2,STM32F3,STM32F4 银洋电子专业一级代理http://www.y-ec.com 联系电话:021-53086303  淘宝网:http://y-ec.taobao.com
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-10 12:07:14 | 显示全部楼层
回复 支持 反对

使用道具 举报

38

主题

292

帖子

1

精华

高级会员

Rank: 4

积分
614
金钱
614
注册时间
2012-7-6
在线时间
0 小时
 楼主| 发表于 2013-1-11 09:51:14 | 显示全部楼层
我顶
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2015-12-22
在线时间
16 小时
发表于 2015-12-22 21:46:41 | 显示全部楼层
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);  这里还是不太明白,要在什么时候使能
回复 支持 反对

使用道具 举报

13

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2012-11-17
在线时间
18 小时
发表于 2015-12-22 22:38:02 | 显示全部楼层
回复【4楼】无韵芦苇:
---------------------------------
看来你没看仔细,人家上面说了,在需要发送数据的时候就使能,此时发送缓冲区一般情况下是空的,那么就会立即进入相应的串口中断,在中断里发送你想发的数据。
回复 支持 反对

使用道具 举报

4

主题

7

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2016-12-2
在线时间
20 小时
发表于 2016-12-2 09:59:44 | 显示全部楼层
谢谢分享。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-25 22:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表