广告

原创 STM32 USART

2009-12-10 10:19 2909 0 1 分类: MCU/ 嵌入式

1、找基址


USART1在APB2上,USART2、3在APB1上:


#define PERIPH_BASE ((u32)0x40000000)
#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)


可以计算到APB2地址:0x40010000;APB1地址:0x40000000.


USART1在APB2上偏移0x3800;USART2和USART3在APB1上偏移分别是0x4400;0x4800.


#define USART1_BASE (APB2PERIPH_BASE + 0x3800)
#define USART2_BASE (APB1PERIPH_BASE + 0x4400)
#define USART3_BASE (APB1PERIPH_BASE + 0x4800)
 


2、定义结构体


typedef struct
{
vu16 SR;            //状态寄存器,只用了低九位
u16 RESERVED1;      //保留
vu16 DR;            //数据寄存器
u16 RESERVED2;      //
vu16 BRR;           //波特比率寄存器
u16 RESERVED3;      //
vu16 CR1;           //控制寄存器 1
u16 RESERVED4;      //
vu16 CR2;           //控制寄存器 2
u16 RESERVED5;      //
vu16 CR3;           //控制寄存器 3
u16 RESERVED6;      //
vu16 GTPR;         //保护时间和预分频寄存器
u16 RESERVED7;     //
} USART_TypeDef;


3、定义各内存地址空间


USART1 = (USART_TypeDef *) USART1_BASE;


USART2 = (USART_TypeDef *) USART2_BASE;


USART3 = (USART_TypeDef *) USART3_BASE;


extern USART_TypeDef *USART1


extern USART_TypeDef *USART2


extern USART_TypeDef *USART3


#define USART1              ((USART_TypeDef *) USART1_BASE)


#define USART2              ((USART_TypeDef *) USART2_BASE)


#define USART3              ((USART_TypeDef *) USART3_BASE)


这时我们就可以操作各寄存器了


4、设置寄存器


USART1->BRR=0x1D4C;


USART1->CR1=0x206c;


USART1->CR2=0x0200;


USART1->CR3=0x0000;


USART1->GTPR=0x0000;


5、中断处理


在stm32f10x_it.c中更改


常用方法


void USART2_IRQHandler(void)


{


   if((USART1->SR&0x0040)!=(u16)0x00)


   {


     //发送完成


     USART1->SR&=~0x0040;


   }


   if((USART1->SR&0x0020)!=0)


   {


     //接收数据


     USART1->SR&=~0x0020;
   }


}


位段方法


#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
// MEM_ADDR(BITBAND( (u32)&CRCValue,1)) = 0x1;


void USART1_IRQHandler(void)

 
if(MEM_ADDR(BITBAND( (u32)&(USART1->SR),6))!=0)
  {


  MEM_ADDR(BITBAND( (u32)&(USART1->SR),6))=0x00;


  }


  if(MEM_ADDR(BITBAND( (u32)&(USART1->SR),5))!=0)
  {


  MEM_ADDR(BITBAND( (u32)&(USART1->SR),5))=0x00;


  }


}


今天终于把这段完成了,也测试完了,终于通了,但还有问题,不知道为什么不能用函数和指针做出来,我想应该是参数传递和指针没有学好,等做好了再补充上来,特别是位段那些。我这些都是宏做出来的

广告

文章评论 1条评论)

登录后参与讨论

billzhu_345737527 2015-7-14 14:35

太好了,找这个找了很久

billzhu_345737527 2013-11-15 17:09

Dear Sir Can please you give me price for parts below. -Rexroth pump card VT-5041-25/1 Thank you and waiting for you reply. Best regards Wannachot Legdee
相关推荐阅读
xzfeng93 2009-11-21 09:36
什么是IAP?如何实现IAP?
来自:http://blog.ednchina.com/STM32/141390/message.aspxIAP是In Application Programming的首字母缩写,IAP是用户自己的程...
我要评论
1
0
广告