串口应该怎么使用
1.使能串口时钟+使能GPIO时钟
2.设置引脚的复位映射
3.配置GPIO引脚初始化,GPIO引脚的模式改为复用模式
4.配置串口的参数
5.中断优先级+配置NVIC初始化
6.使能串口
7.编写中断服务函数
---------------------------------
1.硬件图 (day04/串口.png)
2.
a.使能串口时钟 RCC_APB2PeriphClockCmd
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
参数1:uint32_t RCC_APB2Periph 串口号
RCC_APB2Periph_USART1
参数2:FunctionalState NewState
ENABLE 开启使能 DISABLE 关闭使能
b.设置引脚的复位映射 GPIO_PinAFConfig()
void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
参数1:GPIO_TypeDef* GPIOx 组别
GPIOA ---GPIOG
参数2:uint16_t GPIO_PinSource 引脚号
GPIO_PinSourcex where x can be (0..15).
参数3:uint8_t GPIO_AF
@arg GPIO_AF_USART1: Connect USART1 pins to AF7
@arg GPIO_AF_USART2: Connect USART2 pins to AF7
@arg GPIO_AF_USART3: Connect USART3 pins to AF7
@arg GPIO_AF_UART4: Connect UART4 pins to AF8
@arg GPIO_AF_UART5: Connect UART5 pins to AF8
@arg GPIO_AF_USART6: Connect USART6 pins to AF8
@arg GPIO_AF_UART7: Connect UART7 pins to AF8
@arg GPIO_AF_UART8: Connect UART8 pins to AF8
等下配置复用功能 GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;//复用模式
c.配置串口的参数 USART_Init
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)
参数1:USART_TypeDef* USARTx 串口号
USARTx: where x can be 1, 2, 3, 4, 5, 6, 7 or 8
参数2:USART_InitTypeDef* USART_InitStruct
typedef struct
{
uint32_t USART_BaudRate; /*! 波特率 */
uint16_t USART_WordLength; /*! 字节长度 */
uint16_t USART_StopBits; /*! 停止位 */
uint16_t USART_Parity; /*! 奇偶校验位 */
uint16_t USART_Mode; /*! 模式配置*/
uint16_t USART_HardwareFlowControl; /*! 硬件控制流 */
} USART_InitTypeDef;
1.常用的波特率 是9600 115200
2.
/** @defgroup USART_Word_Length
* @{
*/
#define USART_WordLength_8b ((uint16_t)0x0000)//8位
#define USART_WordLength_9b ((uint16_t)0x1000)//9位
3.
/** @defgroup USART_Stop_Bits
* @{
*/
#define USART_StopBits_1 ((uint16_t)0x0000)
#define USART_StopBits_0_5 ((uint16_t)0x1000)
#define USART_StopBits_2 ((uint16_t)0x2000)
#define USART_StopBits_1_5 ((uint16_t)0x3000)
4./** @defgroup USART_Parity
* @{
*/
#define USART_Parity_No ((uint16_t)0x0000)//常用
#define USART_Parity_Even((uint16_t)0x0400)//奇校验
#define USART_Parity_Odd ((uint16_t)0x0600)//偶校验
5.
/** @defgroup USART_Mode
* @{
*/
#define USART_Mode_Rx ((uint16_t)0x0004)//接收
#define USART_Mode_Tx ((uint16_t)0x0008)//发送
6.
/** @defgroup USART_Hardware_Flow_Control
* @{
*/
#define USART_HardwareFlowControl_None ((uint16_t)0x0000)//无流控
#define USART_HardwareFlowControl_RTS ((uint16_t)0x0100)
#define USART_HardwareFlowControl_CTS ((uint16_t)0x0200)
#define USART_HardwareFlowControl_RTS_CTS ((uint16_t)0x0300)
d.中断优先级+配置NVIC初始化
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
参数:uint32_t NVIC_PriorityGroup
@arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority
4 bits for subpriority
@arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority
3 bits for subpriority
@arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority
2 bits for subpriority
@arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority
1 bits for subpriority
@arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority
0 bits for subpriority
配置中断分组 NVIC_Init()
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
typedef struct
{
uint8_t NVIC_IRQChannel; /*!中断线 */
uint8_t NVIC_IRQChannelPreemptionPriority; /*! 抢占优先级 */
uint8_t NVIC_IRQChannelSubPriority; /*! 响应优先级*/
FunctionalState NVIC_IRQChannelCmd; /*!权限*/
} NVIC_InitTypeDef;
1.
USART1_IRQn = 37, /*! USART1 global Interrupt */
USART2_IRQn = 38, /*! USART2 global Interrupt */
USART3_IRQn = 39, /*! USART3 global Interrupt
USART是通用(U)同步(S)异步(A)收(R)发(T)器。
STM32F103VGT6上有3个USART和2个UART。
同步与异步的区别是:
通信时是否需要对外提供时钟输出。
官方的usart头文件为:
stm32f10x_usart.h
USART有2个结构体:
与USART运行相关:
USART_InitTypeDef
成员有:
// 波特率
USART_BaudRate
// 字长
USART_WordLength
// 停止位
USART_StopBits
// 校验位
USART_Parity
// USART模式
USART_Mode
// 硬件流控制
USART_HardwareFlowControl
与该成员相关的宏定义有:
USART_WordLength
USART_WordLength_8b
USART_WordLength_9b
USART_Stop_Bits
USART_StopBits_1
USART_StopBits_0_5
USART_StopBits_2
USART_StopBits_1_5
USART_Parity
USART_Parity_No
USART_Parity_Even
USART_Parity_Odd
USART_Mode
USART_Mode_Rx
USART_Mode_Tx
USART_Hardware_Flow_Control
USART_HardwareFlowControl_None
USART_HardwareFlowControl_RTS
USART_HardwareFlowControl_CTS
USART_HardwareFlowControl_RTS_CTS
另一个结构体与同步通信相关。
USART_ClockInitTypeDef
成员有:
USART_Clock // 时钟使能控制
USART_CPOL // 时钟极性控制
USART_CPHA // 时钟相位控制
USART_LastBit // 最尾位时钟脉冲控制
该类成员相关的宏定义
USART_Clock
USART_Clock_Disable
USART_Clock_Enable
USART_CPOL
USART_CPOL_Low
USART_CPOL_High
USART_CPHA
USART_CPHA_1Edge
USART_CPHA_2Edge
USART_LastBit
USART_LastBit_Disable
USART_LastBit_Enable
// 使用输入的配置信息USART_InitStruct对于USARTx,进行初始化
USART_Init(USART_TypeDef* USARTx,USART_InitTypeDef* USART_InitStruct);
// 使能串口接收中断
USART_ITConfig(USART_TypeDef* USARTx,uint16_t USART_IT, FunctionalState NewState);
// 使能串口USARTx,NewState=(ENABLE/DISABLE)
USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);
// 在 USARTx 中发送数据Data
USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
// 确认串口USARTx的一些标志位是 set状态还是reset状态
USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
USART_FLAG有:
USART_FLAG_CTS
USART_FLAG_LBD
USART_FLAG_TXE 数据发送寄存器是否为空
USART_FLAG_TC 数据发送完成标志
USART_FLAG_RXNE 数据接收寄存器是否不为空
USART_FLAG_IDLE
USART_FLAG_ORE
USART_FLAG_NE
USART_FLAG_FE
USART_FLAG_PE
// 类似USART_GetFlagStatus,但是专门用来判断中断时间的状态
USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);
USART_IT有:
USART_IT_CTS
USART_IT_LBD
USART_IT_TXE
USART_IT_TC
USART_IT_RXNE 数据接收寄存器是否不为空
USART_IT_IDLE
USART_IT_ORE_RX
USART_IT_ORE_ER
USART_IT_NE
USART_IT_FE
USART_IT_PE
// 获取USARTx接收到的数据
USART_ReceiveData(USART_TypeDef* USARTx);
如果想使用printf来打印调试信息,则生成项目时候需要如下勾选:
会生成两个文件:
syscalls.c和tiny_printf.c
修改 syscalls.c 中的 _write 函数如下:
并在开头加入:
这样就能使用printf了。
程序中自己编写“bsp_usart.c”,“bsp_usart.h”,“main.c”这三个文件:
“bsp_usart.c”文件如下:
“bsp_usart.h”文件如下:
主函数如下:
TrueSTUDIO自带串口通信工具:
由此可见 \r\n 才是真正的回车。
TXE由硬件来管理。当 if(USART_GetITStatus(USART1,USART_IT_TXE) != RESET) 时表明:
数据已经从TDR 移送到移位寄存器,数据发送已经开始;TDR 寄存器被清空;下一个数据可以被写进USART_DR 寄存器而不会覆盖先前的数据,如USART_SendData(USART1, Framewaitsndbuf[ptrshowfra][ptrusart1]),如果此时USART 正在发送数据,对USART_DR 寄存器的写操作把数据存进TDR 寄存器,并在当前传输结束时把该数据复制进移位寄存器。如果此时USART 没有在发送数据,处于空闲状态,对USART_DR 寄存器的写操作直接把数据放进移位寄存器,数据传输开始,TXE 位立即被置起。通常串口中断发送用这种方式。
当一帧发送完成时(停止位发送后),TC 位被置起,并且如果USART_CR1 寄存器中的
TCIE 位被置起时,中断产生。先读一下USART_SR 寄存器,再写一下USART_DR 寄存器,可以完成对TC 位的清零。
本文标签:stm32的usart6怎么使用