OpenEdv-开源电子网

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

原子哥,各位大哥快请帮帮忙,搞了两天了,这个串口都不行。

[复制链接]

3

主题

6

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2014-3-29
在线时间
0 小时
发表于 2015-2-9 16:19:19 | 显示全部楼层 |阅读模式
5金钱

#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((USART1->SR&0X40)==0);//?­?··???,?±??·????ê±?  
 USART1->DR = (u8) ch;     
 return ch;
}
#endif
//end
//////////////////////////////////////////////////////////////////

#ifdef EN_USART1_RX   //??????????????
//?®??1????·??????ò
//×???,????USARTx->SR??±??????????????í?ó    
//????×???
//bit7???????ê??±ê??
//bit6????????0x0d
//bit5~0?????????????§×???????
 
 
void USART1_IRQHandler(void)
{
 u8 res;    
 if(USART1->SR&(1<<5))//??????????
 { 
  res=USART1->DR;
  USART1->DR=res;
       
 }             
}
#endif          
//??????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<<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??????,?????é??.
 
 
 //????????????
 USART1->CR1|=1<<8;    //PE????????
 USART1->CR1|=1<<5;    //??????????·???????????      
 MY_NVIC_Init(3,3,USART1_IRQChannel,2);//×é2??×?????????
}

这个程序只是在原子哥程序基础上改成这样子而已,但是为什么就是接收不了数据很奇怪,照理说不会有错啊,麻烦各位高手帮我看看,小弟在这里给大家拜个早年,祝福大家工作顺利,学业进步,家庭美满,
void USART1_IRQHandler(void)
{
 u8 res;    
 if(USART1->SR&(1<<5))//??????????
 { 
  res=USART1->DR;
  USART1->DR=res;
       
 }             
}就改了这里

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

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11558
金钱
11558
注册时间
2014-4-1
在线时间
1318 小时
发表于 2015-2-9 16:37:19 | 显示全部楼层
昨天刚回答过类似的问题。

提一种可能性。 
在所有中断函数里,不能留连的时间太长,否则容易错过下次中断。
针对这个应用,收到数据立刻退出中断, 
数据放在主循环里面,慢慢处理。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-2-9 22:34:53 | 显示全部楼层
楼主你这代码没问题才对啊
你一次发一个字符试试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-26 03:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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