关于stm32 的UART4
本帖最后由 zhg195X 于 2015-1-8 18:09 编辑这个UART 为何这般坑我。。。之前一直用USART1,2,3 从来没有用过 4和5 ,今天一用,果然和网上大家说的那样很坑。。。特来向大家讨教下。
这是我的程序
#include "stm32f10x.h"
/* 声明GPIO设置函数 */
void GPIO_Config(void);
/* 设置串口 */
void COM_Config(void);
/* 设置中断 */
void NVIC_Config(void);
int main(void)
{
/* 设置GPIO */
GPIO_Config();
/* 设置串口 */
COM_Config();
/* 设置中断 */
NVIC_Config();
while(1)
{ }
}
void GPIO_Config(void)
{
/* 声明GPIO初始化结构体 */
GPIO_InitTypeDef GPIO_InitStructure;
/* 使能 GPIO 时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC |RCC_APB2Periph_AFIO , ENABLE);
/* 使能 USART4 时钟 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
/*USART4输出TX管脚PC10为复用推挽 */
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/*USART4输入Rx管脚PC11为浮空输入 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void COM_Config(void)
{
/* 声明USART初始化结构体 */
USART_InitTypeDef USART_InitStructure;
/* 设置波特率115200 */
USART_InitStructure.USART_BaudRate = 115200;
/* 设置8位数据位 */
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
/* 设置1位停止位 */
USART_InitStructure.USART_StopBits = USART_StopBits_1;
/* 设置无校验 */
USART_InitStructure.USART_Parity = USART_Parity_No;
/* 设置不开启硬件流控制 */
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
/* 设置USART模式为收发 */
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
/* 按照初始化结构体进行USART2的初始化 */
USART_Init(UART4, &USART_InitStructure);
/* 使能UART4 */
USART_Cmd(UART4, ENABLE);
}
void NVIC_Config(void)
{
/* 定义中断向量初始化结构体 */
NVIC_InitTypeDef NVIC_InitStructure;
/* 使能串口4的输入中断 */
USART_ITConfig(UART4,USART_IT_RXNE,ENABLE);
/* 使能串口4的中断向量 */
NVIC_InitStructure.NVIC_IRQChannel=UART4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
下面是终端服务程序
void UART4_IRQHandler(void)
{
char ch;
/* 判断是否接收中断 */
if(USART_GetFlagStatus(UART4,USART_FLAG_RXNE)!=RESET)
{
/* 接受字符放入ch缓存 */
ch=USART_ReceiveData(UART4);
/* 通过USART4发送ch的内容 */
USART_SendData(UART4,ch);
}
/* 清除中断标志 */
USART_ClearFlag(UART4,USART_FLAG_RXNE);
}
/*实在是看不到那块错了。。。。
你用的是那个芯片呢?我之前使用的时候一直好好地 啊 QianFan 发表于 2015-1-9 12:22
你用的是那个芯片呢?我之前使用的时候一直好好地 啊
stm32f107,是我程序出问题了吗 什么现象啊?我觉得USART_ClearFlag(UART4,USART_FLAG_RXNE);好像不是清除中断标志吧? 木易-357428 发表于 2015-1-10 21:30
什么现象啊?我觉得USART_ClearFlag(UART4,USART_FLAG_RXNE);好像不是清除中断标志吧? ...
什么现象也没有,一直发送给stm32 字节,它不回发。。不知道是那块的问题,他这是进不了中断啊。。。你怎么看 看不出来问题,不知道你硬件连接有没有问题。要不你就做一下实验,把USART4的参数都改成USART1看看能不能工作。 标题应该写stm32f107的uart4 哎 我也遇到此问题了,配置的和楼主的一样,就是接收不到数据,不知道楼主咋解决的
页:
[1]