原创 STM32实时时钟(RTC)

2008-12-14 19:41 8963 10 14 分类: MCU/ 嵌入式

     昨天下午调试STM32的RTC功能,参照ST提供的源码,还比较好做,后来想给价格串口修改时间.发现了串口的问题.串口通讯是前几天就写好的,发送接收都没问题.不过今天就发现了不能连续接收字符!只能单个接收,郁闷了好久,从下午5点,搞到晚上两点,找遍了所有资料,最终还是没有搞出来.没办法,不搞了.明天再说.


....


今天早上起来十点多了,继续搞我那个串口的问题,发现每次发送的字符串,只有第一个接收正确,但是串口接收中断却运行了很多次,明显大于我发送的字符串个数.但是如果只发一个数据的时候,它的接收却正常.检查了好几次代码了,都没发现问题.设置也正常. KEIL仿真也很正常.不过keil仿真不能一次接收好几个字符(或者我不知道怎么发).


      按道理没可能串口不能连续接收的,因为我的代码是串口下载的,和我用来通讯的是同一个串口,应该硬件上没有问题的.所以开始怀疑是寄存器设置的问题,于是在代码里增加了好几个与串口相关的寄存器值显示.结果发现USART1->CR1的值和仿真的值不完全一致.一查寄存器的位,才发现寄存器确实有问题,串口USART1->CR1的值和复位的值不一致(复位0X00000000),于是检查串口1的复位代码,一查才发现根本就没有设置复位!于是把代码改了,加入复位代码.终于在改过之后接收正常了!可以连续接收了.


      这个程序耗了我很多时间,所以希望和我一样正在开始学STM32的朋友们,要注意系统复位的检查.寄存器的设置.能少走弯路!


我的串口头函数代码:


#ifndef __USART_H
#define __USART_H
#include "stdio.h"
//注意要包含库:STM32F10xR.LIB,提供USART_SendData()和USART_GetFlagStatus()这两个函数
//正点原子@SCUT
//2008/12/08  
#ifdef __GNUC__        
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
//重定义C语言库函数printf到串口1
PUTCHAR_PROTOTYPE
{          
 USART_SendData(USART1,(u8)ch);//写一个字符到串口1
   while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//循环发送,直到发送完毕  
   return ch;
}   
//中断优先级管理/开启   
void NVIC_Configuration(void)
{
 NVIC_InitTypeDef NVIC_InitStructure; 
 #ifdef  VECT_TAB_RAM             
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
 #else          
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);  
 #endif                  
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);   
 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 NVIC_Init(&NVIC_InitStructure);          
}
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误
u8 time_set[7]; //时间设置寄存器 
u8 rebuffer[14];//接收缓冲 
u8 recount="0";   //接收完全    
void USART1_IRQHandler(void)
{
 u8 res;    
 if(USART1->SR&(1<<5))//接收到数据
 { 
  res=USART1->DR;        
  if(recount<14&&res>47&&res<58)//仅仅接收数据
  {
   rebuffer[recount]=res-'0';//得到ASCII
   recount++;
  }                 
 } 
}           
//初始化IO 串口1
void uart_init()
{    
 RCC->APB2RSTR|=1<<14;   //复位串口1
 RCC->APB2RSTR&=~(1<<14);//停止复位
 //先使能时钟(切记)
    RCC->APB2ENR|=1<<9;   //TX
 RCC->APB2ENR|=1<<10;  //RX  
 GPIOA->CRH=0X444444B4;//IO状态设置
 RCC->APB2ENR|=1<<2;   //使能PORTA口时钟 
 RCC->APB2ENR|=1<<14;  //使能串口时钟
 //波特率设置
  USART1->BRR=0X1D4C;    //9600波特率(72M时钟) 
 USART1->CR1|=0X200C;   //1位停止,无校验位.
 //使能接收中断
 USART1->CR1|=1<<8;    //PE中断使能
 USART1->CR1|=1<<5;    //接收缓冲区非空中断使能 
 NVIC_Configuration(); //中断开启 
}
#endif


全图


点击看大图


全图点击看大图


屏幕1


点击看大图


屏幕2


 附上我的代码(RVMDK):https://static.assets-stash.eet-china.com/album/old-resources/2008/12/14/8a53b564-d490-49dc-95fb-d184abae8d9b.rar

文章评论4条评论)

登录后参与讨论

用户238109 2011-9-7 14:43

能做到中文显示不……

用户1459213 2010-3-12 22:05

学学习下!

用户1376041 2009-4-3 18:07

我也遇到了同样的问题,谢谢你得分享

qsjit_510398083 2008-12-28 13:32

太好了
相关推荐阅读
正点原子 2013-05-17 23:47
【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第六十一章 战舰STM32开发板综合实验(标准例程终结篇)
   第六十一章 战舰STM32开发板综合实验        前面已经给大家讲了55个实例了,本章将设计一个综合实例,作为本指南的最后一个实验 ,该实验向大家展示了STM...
正点原子 2013-05-03 23:02
【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第六十章 UCOSII实验3-消息队列、信号量集和软件定时器
   第六十章 UCOSII实验3-消息队列、信号量集和软件定时器   上一章,我们学习了UCOSII的信号量和邮箱的使用,本章,我们将学习消息队列、信号量集和软件定时器...
正点原子 2013-05-03 20:42
【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第五十七章 ENC28J60网络实验
第五十七章 ENC28J60网络实验   本章,我们将向大家介绍ALIENTEK ENC28J60网络模块及其使用。本章,我们将使用ALIENTEK ENC28J60网络模块...
正点原子 2013-05-01 23:00
【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第五十九章 UCOSII实验2-信号量和邮箱
第五十九章 UCOSII实验2-信号量和邮箱      上一章,我们学习了如何使用UCOSII,学习了UCOSII的任务调度,但是并没有用到任务间的同步与通信,本章我们将学习两个最基本的...
正点原子 2013-04-30 10:55
【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第五十八章 UCOSII实验1-任务调度
  第五十八章 UCOSII实验1-任务调度      前面我们所有的例程都是跑的裸机程序(裸奔),从本章开始,我们将分3个章节向大家介绍UCOSII(实时多任务操作系...
正点原子 2013-04-26 23:16
【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第五十七章 ENC28J60网络实验
 第五十七章 ENC28J60网络实验  本章,我们将向大家介绍ALIENTEK ENC28J60网络模块及其使用。本章,我们将使用ALIENTEK ENC28J60网络模块和uIP 1...
我要评论
4
10
关闭 站长推荐上一条 /2 下一条