当前位置:首页 > STM32 例程 串口实验
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 使能 GPIO 时钟 */
RCC_APB2PeriphClockCmd(COM_TX_PORT_CLK[COM] | COM_RX_PORT_CLK[COM] | RCC_APB2Periph_AFIO, ENABLE);
/* 使能 UART 时钟 */ if (COM == COM1) {
RCC_APB2PeriphClockCmd(COM_USART_CLK[COM], ENABLE); } else {
/* 使能 USART2 引脚软件重映射 */
GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);
RCC_APB1PeriphClockCmd(COM_USART_CLK[COM], ENABLE); }
/* 配置 USART Tx 为复用推挽输出模式 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = COM_TX_PIN[COM]; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(COM_TX_PORT[COM], &GPIO_InitStructure);
/* 配置 USART Rx 为浮空输入模式 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Pin = COM_RX_PIN[COM]; GPIO_Init(COM_RX_PORT[COM], &GPIO_InitStructure);
/* USART 配置 */
USART_Init(COM_USART[COM], USART_InitStruct);
/* 使能 USART */
USART_Cmd(COM_USART[COM], ENABLE); }
[编辑] stm32f10x_it.c
[编辑] USART 中断服务程序USARTx_IRQHandler #ifdef USE_STM3210C_EVAL
#define USARTx_IRQHandler USART2_IRQHandler
#else
#define USARTx_IRQHandler USART1_IRQHandler #endif
#define TxBufferSize (countof(TxBuffer) - 1) #define RxBufferSize 0x20
#define countof(a) (sizeof(a) / sizeof(*(a)))
uint8_t TxBuffer[] = \USART-Hyperterminal\\
communication using Interrupt\\n\\r%uint8_t RxBuffer[RxBufferSize];
uint8_t NbrOfDataToTransfer = TxBufferSize; uint8_t NbrOfDataToRead = RxBufferSize; uint8_t TxCounter = 0; uint16_t RxCounter = 0;
/*-----------------------------------------------------------------------------------------------------
// 功能描述 该函数处理 USARTx 总的中断请求 // 输入参数 无 // 返回值 无
-----------------------------------------------------------------------------------------------------*/ void USARTx_IRQHandler(void) {
if(USART_GetITStatus(EVAL_COM1, USART_IT_RXNE) != RESET) {
/* 读一个字节从数据寄存器 */
RxBuffer[RxCounter++] = (USART_ReceiveData(EVAL_COM1) & 0x7F);
if(RxCounter == NbrOfDataToRead) {
/* 关闭 EVAL_COM1 接收中断 */
USART_ITConfig(EVAL_COM1, USART_IT_RXNE, DISABLE); } }
if(USART_GetITStatus(EVAL_COM1, USART_IT_TXE) != RESET) {
/* 写一个字节到数据寄存器 */
USART_SendData(EVAL_COM1, TxBuffer[TxCounter++]);
if(TxCounter == NbrOfDataToTransfer) {
/* 关闭 EVAL_COM1 发送中断 */
USART_ITConfig(EVAL_COM1, USART_IT_TXE, DISABLE); } } }
[编辑] 系统结构设计
文件:TB 串口实验系统框图.png
[编辑] 程序设计分析
[编辑] 数据结构和算法分析
USART1初始化
USART1的初始化大致分为下面4个步骤: 1、RCC配置
使用RCC_APB2PeriphClockCmd函数: 使能GPIO时钟 使能AFIO时钟
使能USART1时钟(USART1是APB2的外设)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); 2、GPIO配置
使用GPIO_Init函数:
配置 USART1 Tx 为复用推挽输出模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); ::配置 USART1 Rx 为浮空输入模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_Init(GPIOA, &GPIO_InitStructure); 3、NVIC配置
使用NVIC_Init函数使能 USART1 中断
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); 4、USART1配置
使用USART_Init函数配置USART1如下: 波特率9600 字长8位 停止位1位 不使用校验
不使用硬件流控制 (RTS 和 CTS 信号) 收发使能
USART_InitTypeDef USART_InitStructure;
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; USART_Init(USART1, &USART_InitStructure);
使用USART_IT_Config函数: 使能TXE中断
USART_ITConfig(USART1, USART_IT_TXE, ENABLE); ::使能RXNE中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
使用USART_Cmd函数使能USART1
USART_Cmd(USART1, ENABLE); USART1中断服务程序
实验要求开发板先向PC发送数据,表示开发板已经做好了接收数据的准备。PC接收后,就可以向开发板发送数据了。开发板接收到PC发来的数据后,立即将数据再发回给PC,以实现回显功能。当PC向开发板发送的数据是回车(\\r')时,PC端要实现回车的功能(回到下一行行首),开发板就要发回'\\n'和'\\r'。只有在开始时,开发板向PC发送数据时,使用了TXE中断,在回显时,并没有使用到TXE中断,因此,在开发板发送完提示信息后,必须将TXE中断关闭。使用LED3指示数据正在传输。
共分享92篇相关文档