原创 跟我学STM32之3 串口使用

2009-12-31 21:13 4864 12 14 分类: MCU/ 嵌入式
串口能给我们编程调试带来很大帮助,STM32的串口使用起来也很简单,参考官方代码,然后对照STM32手册,就能找到相关寄存器设置,以及设置的先后顺序.
以下是我写的对串口操作的c文件,串口1测试无问题,串口2,3还未测试,各位可以根据自己的需要对void uart_init(u32 pclk2,u32 bound)里面的相应寄存器做修改.如果有问题请通知我.

#include "sys.h"
#include "usart.h"
//正点原子@HYW
//2009/12/08
//V1.3
//支持适应不同频率下的串口波特率设置.
   
#ifdef __GNUC__         
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
//重定义C语言库函数printf到串口1
//CHECK OK
//091209
PUTCHAR_PROTOTYPE
{           
USART1->DR=ch;//写一个字符到串口1   
   while(1)//循环发送,直到发送完毕
{
  if(USART1->SR&0X40)break;//如果发送完了,跳出
};   
   return ch;
}   
//中断优先级管理/开启
//CHECK OK
//091209   
void NVIC_Configuration(void)
{
  MY_NVIC_PriorityGroupConfig(0);//设置分组0  全部4位都是响应优先级        
MY_NVIC_Init(0,1,USART1_IRQChannel,0);//响应优先级1,抢占优先级0(未配置)            
}
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误   
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)//仅仅接收数据 (0~9)
  {
   rebuffer[recount]=res-'0';//得到ASCII
   recount++;
  }                  
}  
}            
//初始化IO 串口1
//pclk2:CLK2时钟频率(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=0X444444B4;//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;    //接收缓冲区非空中断使能
NVIC_Configuration(); //中断管理,不开启
}

源码:https://static.assets-stash.eet-china.com/album/old-resources/2009/12/25/bd9ad12f-31f2-4ab2-b6cf-26ab646fab1c.rar


上位机接收到的数据:


点击看大图

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户235572 2010-2-1 08:33

您好: 我在网上看了您做的MP3闹钟(STM32VS1053TEA5767)网络视频,觉得您做的非常好,由于本身也比较喜欢做一些电子DIY器件,自己也想做一个您上传视频中的那个东东(实用有好):),同时跟您学习学习,您是否方便给点原理图和代码,谢谢!做出板子后送您一些,呵呵。njdada1@126.com

liujun6037_345432000 2009-12-29 20:52

今天调试了半天,发现FSMC和其他共用的时候,FSMC对IO口有较先的优先级. 同时开复用,IO会复用到FSMC上去...
相关推荐阅读
正点原子 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...
我要评论
2
12
关闭 站长推荐上一条 /3 下一条