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;
}
}
今天终于把这段完成了,也测试完了,终于通了,但还有问题,不知道为什么不能用函数和指针做出来,我想应该是参数传递和指针没有学好,等做好了再补充上来,特别是位段那些。我这些都是宏做出来的
用户377235 2015-7-14 14:35
用户377235 2013-11-15 17:09