STM32 例程 串口实验

发布时间 : 星期日 文章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指示数据正在传输。

联系合同范文客服:xxxxx#qq.com(#替换为@)