新手上路
- 积分
- 36
- 金钱
- 36
- 注册时间
- 2016-3-23
- 在线时间
- 8 小时
|
1金钱
用的板子是SK-m32F407,程序用的是原子哥的寄存器版,用的串口3晶振25M,经过修改已可以printf函数发送,但接受不到数据乱码,进不了中断。下面是程序,我是新手希望大家帮我看看,弄了一个礼拜了没调通。
主函数
int main(void)
{
u8 t;
u8 len;
u16 times=0;
Stm32_Clock_Init(336,25,2,7);//设置时钟,168Mhz
delay_init(168); //延时初始化
uart_init(42,115200); //串口初始化为115200
LED_Init(); //初始化与LED连接的硬件接口
while(1)
{
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
printf("\r\n您发送的消息为:\r\n");
for(t=0;t<len;t++)
{
USART3->DR=USART_RX_BUF[t];
while((USART3->SR&0X40)==0);//等待发送结束
}
printf("\r\n\r\n");//插入换行
USART_RX_STA=0;
}else
{
times++;
if(times%5000==0)
{
printf("\r\nALIENTEK 探索者STM32F407开发板 串口实验\r\n");
printf("正点原子@ALIENTEK\r\n\r\n\r\n");
}
if(times%200==0)printf("请输入数据,以回车键结束\r\n");
//if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
delay_ms(10);
}
}
}
串口初始化函数
void uart_init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV@OVER8=0
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分@OVER8=0
mantissa<<=4;
mantissa+=fraction;
RCC->AHB1ENR|=1<<2; //使能PORTA口时钟 c
RCC->APB1ENR|=1<<18; //使能串口1时钟
GPIO_Set(GPIOC,PIN10,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PA9,PA10,复用功能,上拉输出
GPIO_Set(GPIOC,PIN11,GPIO_MODE_AF,GPIO_OTYPE_OD,GPIO_SPEED_50M,GPIO_PUPD_PU);
GPIO_AF_Set(GPIOC,10,7); //PA9,AF7
GPIO_AF_Set(GPIOC,11,7);//PA10,AF7
//波特率设置
USART3->BRR=mantissa; //波特率设置
USART3->CR1&=~(1<<15); //设置OVER8=0
USART3->CR1|=1<<3; //串口发送使能
#if EN_USART3_RX //如果使能了接收
//使能接收中断
USART3->CR1|=1<<2; //串口接收使能
USART3->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(2,2,USART3_IRQn,2);//组2,最低优先级
//SCB->AIRCR = 0x05FA0000 | 0x400;
//NVIC->ISER[1] |= (1<<(39-32));
//SysTick_Config(SystemCoreClock/1000);
#endif
USART3->CR1|=1<<13; //串口使能
}
相关的寄存器已经修改,只是注释没有改,希望高手指点,谢谢
|
|