电子产业
数字化服务平台

扫码下载
手机洽洽

  • 微信小程序

    让找料更便捷

  • 扫码下载手机洽洽

    随时找料

    即刻洽谈

    点击下载PC版
  • 公众号

    电子元器件

    采购信息平台

  • 移动端

    生意随身带

    随时随地找货

  • 华强商城公众号

    一站式电子元器件

    采购平台

  • 芯八哥公众号

    半导体行业观察第一站

STM32实时时钟(RTC)

来源:-- 作者:-- 浏览:1489

标签:rtc

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

昨天下午调试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

技术资讯 技术方案 技术应用 技术新品 技术前沿 行业方案 行业应用 行业新品 行业前沿

型号 厂商 价格
EPCOS 爱普科斯 /
STM32F103RCT6 ST ¥461.23
STM32F103C8T6 ST ¥84
STM32F103VET6 ST ¥426.57
STM32F103RET6 ST ¥780.82
STM8S003F3P6 ST ¥10.62
STM32F103VCT6 ST ¥275.84
STM32F103CBT6 ST ¥130.66
STM32F030C8T6 ST ¥18.11
N76E003AT20 NUVOTON ¥9.67
Baidu
map