完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近我看了原子哥写的串口程序好像明白了
但是我想改为串口2工作改怎么改啊郁闷了感觉可以了啊就是不行。 我该了 #include <STM32f10x_lib.h> #include"sys.h" #include"delay.h" #include"usart.h" #include"led.h" u8 t; u8 len; int main(void) { Stm32_Clock_Init(9); delay_init(72); //延时初始化 uart_init(36,9600); LED_Init(); while(1) { if(USART_RX_STA&0x80) { len=USART_RX_STA&0x3f; for(t=0;t USART2->DR=USART_RX_BUF[t]; while((USART2->SR&0X40)==0); } printf("nn");//插入换行 USART_RX_STA=0; } LED0=!LED0; delay_ms(300); } } 以上是主程序就是改成串口2了其他的没变 #include "sys.h" #include "usart.h" ////////////////////////////////////////////////////////////////////////////////// //本程序只供学习使用,未经作者许可,不得用于其它任何用途 //Mini STM32开发板 //串口1初始化 //发烧友@ALIENTEK //技术论坛:www.openedv.com //修改日期:2010/5/27 //版本:V1.3 //版权所有,盗版必究。 //Copyright(C) 发烧友 2009-2019 //All rights reserved //******************************************************************************** //V1.3修改说明 //支持适应不同频率下的串口波特率设置. //加入了对printf的支持 //增加了串口接收命令功能. //修正了printf第一个字符丢失的bug ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// //加入以下代码,支持printf函数,而不需要选择use MicroLIB #if 1 #pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; /* FILE is typedef’ d in stdio.h. */ FILE __stdout; //定义_sys_exit()以避免使用半主机模式 _sys_exit(int x) { x = x; } //重定义fputc函数 int fputc(int ch, FILE *f) { while((USART2->SR&0X40)==0);//循环发送,直到发送完毕 USART2->DR = (u8) ch; return ch; } #endif //end ////////////////////////////////////////////////////////////////// #ifdef EN_USART2_RX //如果使能了接收 //串口1中断服务程序 //注意,读取USARTx->SR能避免莫名其妙的错误 u8 USART_RX_BUF[64]; //接收缓冲,最大64个字节. //接收状态 //bit7,接收完成标志 //bit6,接收到0x0d //bit5~0,接收到的有效字节数目 u8 USART_RX_STA=0; //接收状态标记 void USART2_IRQHandler(void) { u8 res; if(USART2->SR&(1<<5))//接收到数据 { res=USART2->DR; if((USART_RX_STA&0x80)==0)//接收未完成 { if(USART_RX_STA&0x40)//接收到了0x0d { if(res!=0x0a)USART_RX_STA=0;//接收错误,重新开始 else USART_RX_STA|=0x80; //接收完成了 }else //还没收到0X0D { if(res==0x0d)USART_RX_STA|=0x40; else { USART_RX_BUF[USART_RX_STA&0X3F]=res; USART_RX_STA++; if(USART_RX_STA>63)USART_RX_STA=0;//接收数据错误,重新开始接收 } } } } } #endif 以上是串口2中断接受 //初始化IO 串口1 //pclk2CLK2时钟频率(Mhz) //bound:波特率 //CHECK OK //091209 void uart_init(u32 pclk2,u32 bound) { float temp; u16 mantissa; u16 fraction; temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV mantissa=temp; //得到整数部分 fraction=(temp-mantissa)*16; //得到小数部分 mantissa<<=4; mantissa+=fraction; RCC->APB2ENR|=1<<5; //使能PORTD口时钟 RCC->APB1ENR|=1<<17; //使能串口时钟 GPIOD->CRL&=0XF00FFFFF; GPIOD->CRL|=0X08B00000;//IO状态设置 RCC->APB1RSTR|=1<<17; //复位串口2 RCC->APB1RSTR&=~(1<<17);//停止复位 //波特率设置 USART2->BRR=mantissa; // 波特率设置 USART2->CR1|=0X200C; //1位停止,无校验位. #ifdef EN_USART2_RX //如果使能了接收 //使能接收中断 USART2->CR1|=1<<8; //PE中断使能 USART2->CR1|=1<<5; //接收缓冲区非空中断使能 MY_NVIC_Init(3,1,USART2_IRQChannel,2);//组2,最低优先级 #endif } 我在论坛上搜了原子哥发的串口4的例子我到时看明白了但是我按照这个例子改成串口2就是不行了 请帮忙看看吧附近是我的程序 uart2.zip (539.16 KB ) |
|
相关推荐
3个回答
|
|
我知道啊 我程序上也是这样改得啊uart_init(36,9600);没错啊 但是就是不行啊 郁闷了
|
|
|
|
原子哥 我看过你发的其他串口的例程 感觉就是那样 我按照那个例程改了 还是不好使能帮下忙吗?我在论坛上几乎搜遍了 但是没有串口2的例程
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1278 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1290 浏览 1 评论
695 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
514 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1299 浏览 2 评论
1713浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
416浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
380浏览 3评论
367浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
343浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-18 02:06 , Processed in 0.922558 second(s), Total 82, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号