用《精通》一书中的串口通信例程中的代码,程序没有问题,运行良好。
第一个问题:
使用书中例程中的 uart_init()初始化函数,配自己写的串口通信子函数,运行后,每次发送,通过串口调试软件发现,接收到的字符不是发送的
且每次发送后,接收到的内容都不一样
自己编写的串口通信子函数在下面一并贴出.
第二个问题
用直接给寄存器置数的方法编写的初始化函数和自己编写的串口通信子函数,结果是程序不收发串口数据。
下面是代码:
//采用移位的方式设置,使用头文件stm32f4xx.h
/*
//使能时钟
RCC->AHB1ENR|=1<<0; //使能PA口时钟
RCC->APB2ENR|=1<<4; //使能串口1时钟
//设置PA9
GPIOA->MODER&=~(3<<2*9); //模式清零
GPIOA->MODER|=2<<(2*9); //设置模式值10为复用
GPIOA->OSPEEDR&=~(3<<2*9); //速度,清零
GPIOA->OSPEEDR|=2<<(2*9); //速度50M
GPIOA->OTYPER&=~(1<<9); //输出模式,清零
GPIOA->OTYPER|=0<<9; //推挽输出
GPIOA->PUPDR&=~(3<<(2*9)); //上下拉,清零
GPIOA->PUPDR|=1<<(2*9); //值 01,上拉
GPIOA->AFR[1]&=~(15<<(4*1)); //复用寄存器设置,清零
GPIOA->AFR[1]|=(7<<(4*1)); //值 0111(AF7) ,PA9口,复用为串口1
//设置PA10
GPIOA->MODER&=~(3<<(2*10)); //设置PA10,模式清零
GPIOA->MODER|=2<<(2*9); //模式值 10 为复用
GPIOA->OSPEEDR&=~(3<<(2*10));//速度,清零
GPIOA->OSPEEDR|=2<<(2*10); //设置值 10 为50MHZ
GPIOA->PUPDR&=~(3<<(2*10)); //上下拉清零
GPIOA->PUPDR|=1<<(2*10); //设置值01 为上拉
GPIOA->OTYPER&=~(1<<10); //输出模式,清零
GPIOA->OTYPER|=0<<10; //值 0 ,推挽输出
GPIOA->AFR[1]&=~(15<<(4*2)); //复用寄存器,清零
GPIOA->AFR[1]|=(7<<(4*2)); //复用寄存器,值AF7(0111),复用为串口1
USART1->BRR|=0x2d9; //串口1波特率设置为11520,该寄存器置数,只能直接写值,不能用移位方式
USART1->CR1&=~(1<<15); //设置OVER8位置 0
USART1->CR1&=~(1<<13); //UE位清零
USART1->CR1|=1<<13; //UE位设置为1,串口1使能
USART1->CR1&=~(1<<12); //M位 置 0,字长8位
void Usart_UsartData(void) //自己编写的串口收发数据子函数
{
u8 Usart_set;
if(USART1->SR&(1<<5))
{
Usart_set=USART1->DR; //接收到的数据保存到Usart_set中
USART1->DR=Usart_set; //把接收到的数据发送到PC
while((USART1->SR&0x40)==0);
}
}
什么原因,代码那里有问题。
一周热门 更多>