OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2716|回复: 8

请教串口实验的问题

[复制链接]

76

主题

187

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2014-10-15
在线时间
138 小时
发表于 2015-12-25 18:16:45 | 显示全部楼层 |阅读模式
5金钱
我买了《例说STM32》(第二版),正在学习第八章,串口试验。
我照着书上的例子敲代码,还参考网上下的开发板例程。
代码如下:
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<<2;   //使能PORTA口时钟  
RCC->APB2ENR|=1<<14;  //使能串口时钟 
GPIOA->CRH&=0XFFFFF00F; 
GPIOA->CRH|=0X000008B0;//IO状态设置
 
RCC->APB2RSTR|=1<<14;   //复位串口1
RCC->APB2RSTR&=~(1<<14);//停止复位     
//波特率设置
  USART1->BRR=mantissa; // 波特率设置  
USART1->CR1|=0X200C;  //1位停止,无校验位.
//#ifdef EN_USART1_RX  //如果使能了接收
//使能接收中断
USART1->CR1|=1<<8;    //PE中断使能
USART1->CR1|=1<<5;    //接收缓冲区非空中断使能    
MY_NVIC_Init(3,3,USART1_IRQn,2);//组2,最低优先级 
//#endif
}
int main(void)
{
u8 t;
u8 len;
u16 times=0;

Stm32_Clock_Init(6);    //72MHz
  delay(1000);
LED_Init();
uart_init(72,9600);
while(1)
{
     
if(USART_RX_STA&0x80)
{   
len=USART_RX_STA&0x3f;//得到此次接收到的数据长度
printf("\n您发送的消息为:\n");
for(t=0;t<len;t++)
{
USART1->DR=USART_RX_BUF[t];
while((USART1->SR&0X40)==0);//等待发送结束
}
printf("\n\n");//插入换行
USART_RX_STA=0;
}else
{
times++;
if(times%5000==0)
{
printf("\nMiniSTM32开发板 串口实验\n");
printf("正点原子@ALIENTEK\n\n\n");
}
if(times%200==0)printf("请输入数据,以回车键结束\n");  
//if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
//delay_ms(10); 
delay(1000);
}
}
}
中断函数:
void USART1_IRQHandler(void)
{
u8 res;    
if(USART1->SR&(1<<5))//接收到数据
{  
res=USART1->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;//接收数据错误,重新开始接收  
}  
}
}       
}    

编译通过后,下到板子里,打开串口,没反应,什么也没发出来。
请问高手,哪里有错?谢谢!

最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-12-25 18:16:46 | 显示全部楼层
chenbingjy 发表于 2015-12-26 09:57
谢谢!delay()是我自己定义的。
void delay(int z)
{

仿真下。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5781
金钱
5781
注册时间
2013-11-22
在线时间
1212 小时
发表于 2015-12-25 23:03:15 | 显示全部楼层
main 函数里面delay(1000);怎么来的? 延时函数初始化了么, 仿真看看是不是卡在delay(1000);这儿了
回复

使用道具 举报

76

主题

187

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2014-10-15
在线时间
138 小时
 楼主| 发表于 2015-12-26 09:57:37 | 显示全部楼层
谢谢!delay()是我自己定义的。
void delay(int z)
{
        int i,j;
        for(i=0;i<z;i++)
                for(j=0;j<1000;j++);
}
回复

使用道具 举报

39

主题

598

帖子

0

精华

高级会员

Rank: 4

积分
875
金钱
875
注册时间
2013-12-18
在线时间
41 小时
发表于 2015-12-26 23:16:49 | 显示全部楼层
你驱动装了吗?340的,程序看起来OK啊
回复

使用道具 举报

76

主题

187

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2014-10-15
在线时间
138 小时
 楼主| 发表于 2015-12-31 09:39:54 | 显示全部楼层
本帖最后由 chenbingjy 于 2015-12-31 09:44 编辑

没有JTAG
回复

使用道具 举报

76

主题

187

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2014-10-15
在线时间
138 小时
 楼主| 发表于 2015-12-31 09:41:25 | 显示全部楼层
w417074951 发表于 2015-12-26 23:16
你驱动装了吗?340的,程序看起来OK啊

谢谢!我的板子不是正点原子的,我用开发板配套例程可以通讯。
回复

使用道具 举报

76

主题

187

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2014-10-15
在线时间
138 小时
 楼主| 发表于 2015-12-31 09:46:26 | 显示全部楼层
我的板子芯片是STM32F103RBT6,程序应该通用的吧。
好奇怪,我明明写的JTAG,怎么变成JTAG了。
回复

使用道具 举报

76

主题

187

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2014-10-15
在线时间
138 小时
 楼主| 发表于 2015-12-31 10:31:45 | 显示全部楼层
搞好了,很奇怪,不能用printf
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 05:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表