OpenEdv-开源电子网

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

参考蓝牙例程写的一个串口定时中断程序,有一些问题希望大家帮我看下,谢谢

[复制链接]

10

主题

86

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
481
金钱
481
注册时间
2013-12-3
在线时间
82 小时
发表于 2014-6-20 21:59:06 | 显示全部楼层 |阅读模式
5金钱
参考蓝牙例程写的一个串口定时中断程序,也有前辈写过类似的,不过是用库函数写的,我看不太懂,就自己仿着写了一个,大家帮我看下哪里有问题,我下载到mini板子上后,发送几个字符过去,确不会返回字符!! 这跟我想的不一样,我自己也是检查了好几遍了,还是不通,麻烦大家帮看下哪里的问题,多谢啦
[mw_shl_code=c,true]USART.C[/mw_shl_code] [mw_shl_code=c,true]#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??±??????????????í?ó u8 USART_RX_BUF[USART_MAX_RECV_LEN]; //????????,×??ó64??×???. //????×??? //bit7???????ê??±ê?? //bit6????????0x0d //bit5~0?????????????§×??????? u8 USART_RX_STA=0; //????×???±ê?? void USART1_IRQHandler(void) { u8 res; if(USART1->SR&(1<<5)) { res=USART1->DR; if(USART_RX_STA<USART_MAX_RECV_LEN) { TIM4->CNT=0; if(USART_RX_STA==0)TIM4_Set(1); USART_RX_BUF[USART_RX_STA++]=res; }else { USART_RX_STA|=1<<15; } } } #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??????,?????é??. #ifdef EN_USART1_RX //?????????????? //???????????? USART1->CR1|=1<<8; //PE???????? USART1->CR1|=1<<5; //??????????·??????????? MY_NVIC_Init(2,3,USART1_IRQChannel,2);//×é2??×????????? TIM4_Init(99,7199); USART_RX_STA=0; TIM4_Set(0); #endif } //?¨?±?÷4????·??????ò void TIM4_IRQHandler(void) { if(TIM4->SR&0X01)//???ü?????? { USART_RX_STA|=1<<15; //±ê???????ê?? TIM4->SR&=~(1<<0); //????????±ê???? TIM4_Set(0); //??±?TIM4 } } //?è??TIM4?????? //sta:0????±?;1,????; void TIM4_Set(u8 sta) { if(sta) { TIM4->CNT=0; //?????÷???? TIM4->CR1|=1<<0; //?????¨?±?÷4 }else TIM4->CR1&=~(1<<0);//??±??¨?±?÷4 } //?¨???¨?±?÷?????????? //??????????????APB1??2±?????APB1??36M //arr??×?????×°???? //psc???±???¤·????? void TIM4_Init(u16 arr,u16 psc) { RCC->APB1ENR|=1<<2; //TIM4?±?????? TIM4->ARR=arr; //?è?¨?????÷×?????×°?? TIM4->SC=psc; //?¤·????÷ TIM4->DIER|=1<<0; //???í?ü?????? TIM4->CR1|=0x01; //?????¨?±?÷4 MY_NVIC_Init(1,3,TIM4_IRQChannel,2);//????2??×???????3??×é2 ??2????????×??? } [/mw_shl_code]
[mw_shl_code=c,true]mian.c[/mw_shl_code] [mw_shl_code=c,true]#include "sys.h" #include "usart.h" #include "delay.h" #include "led.h" #include "key.h" //#include "timer.h" //Mini STM32??·?°?·????ú??3 //?®?????é //??????×?@ALIENTEK //????????:www.openedv.com int main(void) { u8 len; u8 t; //u16 times=0; Stm32_Clock_Init(9); //?????±???è?? delay_init(72); //???±?????? uart_init(72,9600); //?®??????????9600 LED_Init(); //????????LED?????????????? //Timerx_Init(4999,7199); while(1) { delay_ms(500); LED1=!LED1; if(USART_RX_STA&(1<<15)) { len=USART_RX_STA&0x3f; for(t=0;t<len;t++) { USART1->DR=USART_RX_BUF[t]; while((USART1->SR&0X40)==0);//????·????á?? } USART_RX_STA=0; TIM4_Set(0); } } } [/mw_shl_code]
///中文注释为什么复制过来都是乱码啊 
只能把工程都打包传上来了  

定时器串口中断.zip

338.99 KB, 下载次数: 114

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-6-20 23:11:31 | 显示全部楼层
仿真一下,看看问题出在哪里.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2014-3-12
在线时间
9 小时
发表于 2014-6-21 08:28:21 | 显示全部楼层
volatile u8 USART_RX_STA=0; //试试
功夫再高、也怕羊刀
回复

使用道具 举报

10

主题

86

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
481
金钱
481
注册时间
2013-12-3
在线时间
82 小时
 楼主| 发表于 2014-6-21 12:20:16 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
刚设置好STLINK, 可是不知道怎么看仿真.....
回复

使用道具 举报

10

主题

86

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
481
金钱
481
注册时间
2013-12-3
在线时间
82 小时
 楼主| 发表于 2014-6-21 12:20:45 | 显示全部楼层
回复【3楼】加速度:
---------------------------------
不行额, 加了这个MDK就报错了
回复

使用道具 举报

1

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2014-3-12
在线时间
9 小时
发表于 2014-6-23 08:55:46 | 显示全部楼层
回复【5楼】yy21910115:
---------------------------------
我觉得这个变量定义本来就有点问题

定义:u8 USART_RX_STA=0;
引用:USART_RX_STA|=1<<15;

你要么干脆改为volatile unsigned int USART_RX_STA=0;
功夫再高、也怕羊刀
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 21:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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