OpenEdv-开源电子网

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

用寄存器配置的方法配置串口2的问题

[复制链接]

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2014-2-14
在线时间
0 小时
发表于 2014-2-26 23:51:41 | 显示全部楼层 |阅读模式
请教大家一下,这是我用寄存器的写法修改的串口2,可是为什么传的数据在电脑上显示的全是问号啊???
这是usart.c里面的:

#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
//////////////////////////////////////////////////////////////////

#if EN_USART2_RX   
  
u8 USART_RX_BUF[USART_REC_LEN];     .

u16 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)
{
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  
//??????IO ????2
//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);
mantissa=temp;
fraction=(temp-mantissa)*16; 
    mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2;   
RCC->APB1ENR|=1<<17; 
GPIOA->CRL&=0XFFFF00FF;//IO×????è??
RCC->APB1RSTR|=1<<17;  
RCC->APB1RSTR&=~(1<<17);        

  USART2->BRR=mantissa;   
USART2->CR1|=0X200C;  
#if EN_USART2_RX   
USART2->CR1|=1<<8;    
USART2->CR1|=1<<5;    
MY_NVIC_Init(3,3,USART2_IRQChannel,2);
#endif
}

main函数:

int main(void)
{
u8 key = '2';  
u8 tmp;
u8 ch[5]={'1','2','3','4'};

Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600);
LED_Init();
KEY_Init();
while(1)
{
USART2->DR='1';
while((USART2->SR&0X40)==0);
delay_ms(2200);
USART2->DR='1';
while((USART2->SR&0X40)==0);
delay_ms(2200);
}
}

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-2-27 00:10:33 | 显示全部楼层
你可以参考下我们的蓝牙模块例程,就是串口2初始化
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-2-27 10:08:45 | 显示全部楼层
//初始化IO 串口2
//pclk1CLK1时钟频率(Mhz)
//bound:波特率   
void USART2_Init(u32 pclk1,u32 bound)
{      
RCC->APB2ENR|=1<<8;    //使能PORTG口时钟  
  GPIOG->CRH&=0XFFFFFF0F; //IO状态设置
GPIOG->CRH|=0X00000030; //IO状态设置
RCC->APB2ENR|=1<<2;    //使能PORTA口时钟  
GPIOA->CRL&=0XFFFF00FF; //IO状态设置
GPIOA->CRL|=0X00008B00; //IO状态设置  
RCC->APB1ENR|=1<<17;   //使能串口时钟   
RCC->APB1RSTR|=1<<17;   //复位串口2
RCC->APB1RSTR&=~(1<<17);//停止复位        
//波特率设置
  USART2->BRR=(pclk1*1000000)/(bound);// 波特率设置  
USART2->CR1|=0X200C;   //1位停止,无校验位.
USART2->CR3=1<<7;    //使能串口2的DMA发送
UART_DMA_Config(DMA1_Channel7,(u32)&USART2->DR,(u32)USART2_TX_BUF);//DMA1通道7,外设为串口2,存储器为USART2_TX_BUF 
#ifdef USART2_RX_EN    //如果使能了接收
//使能接收中断
USART2->CR1|=1<<8;     //PE中断使能
USART2->CR1|=1<<5;     //接收缓冲区非空中断使能     
MY_NVIC_Init(2,3,USART2_IRQn,2);//组2,最低优先级 
TIM4_Init(99,7199); //10ms中断
USART2_RX_STA=0; //清零
TIM4_Set(0); //关闭定时器4
#endif   
}
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2014-2-14
在线时间
0 小时
 楼主| 发表于 2014-2-27 12:51:47 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
哎,我参考了你的程序,但是还是不行,收到的全是问号。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-2-27 19:08:26 | 显示全部楼层
回复【4楼】511706987:
---------------------------------
那是你波特率没设置对吧?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2014-2-14
在线时间
0 小时
 楼主| 发表于 2014-3-1 11:54:08 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------

为什么串口2我把波特率设置为uart_init(72,9600); 但实际上我用电脑上接收的话必须是4800的波特率才能接收到数据???这是什么情况啊?串口1和串口2的时钟频率不一样??? 就不能用串口1的计算波特率的这个公式来算波特率了??
        float temp;
        u16 mantissa;
        u16 fraction;           
        temp=(float)(pclk2*1000000)/(bound*16);
        mantissa=temp;                                
        fraction=(temp-mantissa)*16; 
    mantissa<<=4;
        mantissa+=fraction;
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-1 22:08:50 | 显示全部楼层
因为串口2的时钟是串口1的一半,你还是以72M去初始化,自然得到是4800的波特率了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-1 22:09:01 | 显示全部楼层
回复【6楼】511706987:
---------------------------------
因为串口2的时钟是串口1的一半,你还是以72M去初始化,自然得到是4800的波特率了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2014-8-21
在线时间
26 小时
发表于 2014-9-17 16:57:17 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我直接复制的蓝牙里面的串口2程序,初始化串口之后发送字符串,下面是部分程序:
unsigned char *ATCSQ = "AT+CSQ\r\n"; //
unsigned char *ATE0 = "ATE0\x0D\x0A"; //
unsigned char *ATCGREG = "AT+CGREG?\x0D\x0A"; //
unsigned char *ATCIPSHUT = "AT+CIPSHUT\x0D\x0A"; //
unsigned char *ATCIPMUX = "AT+CIPMUX=0\x0D\x0A"; //
unsigned char *ATCIPRXGET = "AT+CIPRXGET=1\x0D\x0A"; //


USART2_Init(36,9600);
u2_printf("%s",ATE0);
u2_printf("%s",ATCGREG);
u2_printf("%s",ATCIPSHUT);
u2_printf("%s",ATCIPMUX);
u2_printf("%s",ATCIPRXGET);


电脑串口接收的数据如下:
?AT+CGRAT+CIPSHUT
AT+CIPMUX=0
AT+CIPRXGET=1AT+CIPRXGET=1

采用16进制显示结果如下:
FF 41 54 2B 43 47 52 41 54 2B 43 49 50 53 48 55 54 0D 41 54 2B 43 49 50 4D 55 58 3D 30 0D 41 54 2B 43 49 50 52 58 47 45 54 3D 31 41 54 2B 43 49 50 52 58 47 45 54 3D 31 0D 0A 

串口发送的过程中
u2_printf("%s",ATE0);这句话的发送结果没有显示;而用16进制显示时开头多了个0xFF;

而最后两句:
u2_printf("%s",ATCIPMUX);
u2_printf("%s",ATCIPRXGET);
发送过程中两句中间没有回程换行符号,16进制显示结果也没有0x0D 0x0A

请问这是什么原因导致部分数据丢失?是硬件电路的问题还是程序的问题?或者接收端有问题?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-17 23:21:02 | 显示全部楼层
回复【9楼】YTCH2014:
---------------------------------
一个个排除。
先排除硬件问题,写简单的代码测试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2015-3-28
在线时间
0 小时
发表于 2015-5-11 20:03:13 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
串口2只能用dma发送吗  ,直接写寄存器可以吗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-12 00:11:17 | 显示全部楼层
回复【11楼】u10024127:
---------------------------------
不是,写寄存器可以的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2015-3-28
在线时间
0 小时
发表于 2015-5-12 16:06:08 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
原子哥,我现在用串口把ov7670的数据发送到串口助手然后编码成bmp显示成功了 , 如果我想 通过wifi发送,然后用网络助手查看 ,是不是配置好wifi,然后直接接到板子上就可以了。  
wifi我用串口配置软件配置 ,然后板子还用 串口发送的程序。    

但是这样结果网络助手收到的数据少了一半。。。我怀疑是wifi还没有转发完,串口又发第下一个个了
我想到的解决办法  1是降低波特率  但是这样发送速度就会慢 
                              2 找到wifi发送数据结束的应答标志 ,收到应答 ,串口才发送下一个 ,但是不知道这个标志怎么找到 
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-12 23:03:13 | 显示全部楼层
回复【13楼】u10024127:
---------------------------------
做协议,wifi模块没有发送成功返回的。
你只有自己做协议保证了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2015-3-28
在线时间
0 小时
发表于 2015-5-13 18:25:18 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
我查看ATK-RM04 串口波特率范围是1200-500000 ,我设置的波特率230400没有超过范围,你觉得可能是 wifi还没有转发完,
串口又发第下一个个了这个原因引起的吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-13 22:46:05 | 显示全部楼层
回复【15楼】u10024127:
---------------------------------
也有可能数据出错丢失了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 14:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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