1.认识串口
串口通信是一种常见的设备通信协议,广泛应用于计算机与外部设备之间的数据交互。串口通信按位(bit)发送和接收字节,尽管比特字节的串行通信速度较慢,但串口可以在使用一根线发送数据的同时用另一根线接收数据。
且串口是串行全双工的通信协议。
2.N32G457REL7-时钟树
以下内容是N32G457REL7的串口所在时钟树的分布图:
3.N32G457REL7-串口引脚重映射详情图
国民技术的串口具有复用和引脚重映射功能,具体解释如下:
3.1串口1引脚分布图与引脚重映射图
3.2串口2引脚分布图与引脚重映射图
3.3串口3引脚分布图与引脚重映射图
3.4串口4,5,6引脚分布图与引脚重映射图
根据自己对串口引脚的选用不同可以选择复用串口的不同引脚。
4.国民技术串口的软件配置
这里为了更容易大家理解,这里博主选择展示两个配置方法。
4.1串口默认引脚的功能配置
此处以串口4的配置为例:
//这些是代码中使用到的宏
#define USART4_GPIO GPIOC
#define USART4_CLK RCC_APB1_PERIPH_UART4
#define USART4_GPIO_CLK RCC_APB2_PERIPH_GPIOC
#define USART4_RxPin GPIO_PIN_11
#define USART4_TxPin GPIO_PIN_10
#define USART4_APBxClkCmd RCC_EnableAPB1PeriphClk
#define USART4_IRQn UART4_IRQn
#define USART4_IRQHandler UART4_IRQHandler
/*
此函数开启了串口4的时钟和引脚对应端口的时钟
*/
void RCC_Configuration_UART4(void)
{
RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_UART4, ENABLE);
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOC, ENABLE);
}
/*
这个函数是配置了串口使用的引脚
*/
void GPIO_Configuration_UART4(void)
{
GPIO_InitType GPIO_InitStructure;
GPIO_InitStruct(&GPIO_InitStructure);
GPIO_InitStructure.Pin = USART4_TxPin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//工作模式为复用推挽输出
GPIO_InitPeripheral(USART4_GPIO, &GPIO_InitStructure);
GPIO_InitStruct(&GPIO_InitStructure);
GPIO_InitStructure.Pin = USART4_RxPin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_InitPeripheral(USART4_GPIO, &GPIO_InitStructure);
}
/*
这个函数是串口4的中断配置
*/
void NVIC_Configuration_USART4(void)
{
NVIC_InitType NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = USART4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_ConfigInt(UART4, USART_INT_RXDNE, ENABLE);
USART_ConfigInt(UART4, USART_INT_RXDNE, ENABLE);
}
/*
这个函数的初始化了串口所需要使用到的引脚和串口配置
其中这里并没有开启串口的中断相关的服务,若有需要可自行开启
*/
void UART4_configure(u32 bound)
{
RCC_Configuration_UART4();
GPIO_Configuration_UART4();
NVIC_Configuration_USART4();
USART_InitType USART_InitStructure;
USART_InitStructure.BaudRate = bound;
USART_InitStructure.WordLength = USART_WL_8B;
USART_InitStructure.StopBits = USART_STPB_1;
USART_InitStructure.Parity = USART_PE_NO;
USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE;
USART_InitStructure.Mode = USART_MODE_RX | USART_MODE_TX;
USART_Init(UART4, &USART_InitStructure);
USART_Enable(UART4, ENABLE);
}
void UART4_IRQHandler(void) // bw16
{
if (USART_GetIntStatus(UART4, USART_INT_RXDNE) != RESET)
{
//此处是串口4对应的接收中断的数据处理,可根据自身续期进行编写
}
if (USART_GetIntStatus(UART4, USART_INT_IDLEF) != RESET)
{
//这里是串口空闲中断的数据处理地方
}
}
上述内容是关于串口4默认引脚的配置。
4.2串口4复用引脚的配置
若要想要使用PA13和PA14作为串口的TX和RX,则需要开启对应的引脚复用功能,具体配置如下:
下图是关于串口4复用功能引脚的相关配置
下面的代码相较于默认串口的功能配置的区别在代码中会有所体现,在代码结束的内容之后也会详细的说。
.
//这些是代码中使用到的宏
#define USART4_GPIO GPIOA
#define USART4_CLK RCC_APB1_PERIPH_UART4
#define USART4_GPIO_CLK RCC_APB2_PERIPH_GPIOA
#define USART4_RxPin GPIO_PIN_14
#define USART4_TxPin GPIO_PIN_13
#define USART4_APBxClkCmd RCC_EnableAPB1PeriphClk
#define USART4_IRQn UART4_IRQn
#define USART4_IRQHandler UART4_IRQHandler
/*
此函数开启了串口4的时钟和引脚对应端口的时钟
并且开启了IO口引脚的复用时钟
*/
void RCC_Configuration_UART4(void)
{
RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_UART4, ENABLE);
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA | RCC_APB2_PERIPH_AFIO, ENABLE);
GPIO_ConfigPinRemap(GPIO_RMP2_UART4, ENABLE);//这里是选择串口4的引脚复用,根据上图所示需要选择映射的第二组引脚
}
/*
这个函数是配置了串口使用的引脚
*/
void GPIO_Configuration_UART4(void)
{
GPIO_InitType GPIO_InitStructure;
GPIO_InitStruct(&GPIO_InitStructure);
GPIO_InitStructure.Pin = USART4_TxPin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//工作模式为复用推挽输出
GPIO_InitPeripheral(USART4_GPIO, &GPIO_InitStructure);
GPIO_InitStruct(&GPIO_InitStructure);
GPIO_InitStructure.Pin = USART4_RxPin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_InitPeripheral(USART4_GPIO, &GPIO_InitStructure);
}
/*
这个函数是串口4的中断配置
*/
void NVIC_Configuration_USART4(void)
{
NVIC_InitType NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = USART4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_ConfigInt(UART4, USART_INT_RXDNE, ENABLE);
USART_ConfigInt(UART4, USART_INT_RXDNE, ENABLE);
}
/*
这个函数的初始化了串口所需要使用到的引脚和串口配置
其中这里并没有开启串口的中断相关的服务,若有需要可自行开启
*/
void UART4_configure(u32 bound)
{
RCC_Configuration_UART4();
GPIO_Configuration_UART4();
NVIC_Configuration_USART4();
USART_InitType USART_InitStructure;
USART_InitStructure.BaudRate = bound;
USART_InitStructure.WordLength = USART_WL_8B;
USART_InitStructure.StopBits = USART_STPB_1;
USART_InitStructure.Parity = USART_PE_NO;
USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE;
USART_InitStructure.Mode = USART_MODE_RX | USART_MODE_TX;
USART_Init(UART4, &USART_InitStructure);
USART_Enable(UART4, ENABLE);
}
void UART4_IRQHandler(void) // bw16
{
if (USART_GetIntStatus(UART4, USART_INT_RXDNE) != RESET)
{
//此处是串口4对应的接收中断的数据处理,可根据自身续期进行编写
}
if (USART_GetIntStatus(UART4, USART_INT_IDLEF) != RESET)
{
//这里是串口空闲中断的数据处理地方
}
}
上述代码主要修改的地方:
1.修改了串口4的io口配置
2.开启了串口4的复用时钟并重映射了串口4的引脚
3.其它配置均未改动
5.总结
国民技术的串口配置与STM32的串口配置几乎相同,配置流程如下:
1.开启串口的时钟
2.选择串口使用的引脚
3.配置对应的引脚功能
4.初始化串口的基本参数
5.根据需求使能对应的串口中断
6.使能串口
7.编写中断服务函数
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/wxy888888/article/details/146841043
|