STM32 USART寄存器方式编程

#include "stm32f10x.h"


#define GPIOA_ODR_A GPIOA_BASE+0X0C
#define GPIOA_IDR_A GPIOA_BASE+0X08

#define GPIOB_ODR_A GPIOB_BASE+0X0C
#define GPIOB_IDR_A GPIOB_BASE+0X08

#define GPIOC_ODR_A GPIOC_BASE+0X0C
#define GPIOC_IDR_A GPIOC_BASE+0X08

#define GPIOD_ODR_A GPIOD_BASE+0X0C
#define GPIOD_IDR_A GPIOD_BASE+0X08

#define GPIOE_ODR_A GPIOE_BASE+0X0C
#define GPIOE_IDR_A GPIOE_BASE+0X08

#define BitBand(Addr,BitNum)  *((volatile unsigned long *)((Addr &0xf0000000)+ 0X2000000 + ((Addr&0Xfffff)<<5)+(BitNum<<2)))
// AliasAddr = 0x2200 0000 + ((A-0X2000 0000)*8+n)*4      (n= 0~7)
//           = 0x2200 0000+ (A-0X2000 0000)*32+n*4      4个字节,32个位;


#define PAout(n) BitBand(GPIOA_ODR_A,n)  //PAout输出表达式;
#define PAin(n)  BitBand(GPIOA_IDR_A,n)  //PAin输出表达式;

#define PBout(n) BitBand(GPIOB_ODR_A,n)  
 #define PBin(n) BitBand(GPIOB_IDR_A , n)


 #define PCout(n) BitBand(GPIOC_ODR_A , n) 
 #define PCin(n) BitBand(GPIOC_IDR_A , n)


 #define PDout(n) BitBand(GPIOD_ODR_A , n) 
 #define PDin(n) BitBand(GPIOD_IDR_A , n)


 #define PEout(n) BitBand(GPIOE_ODR_A , n) 
 #define PEin(n) BitBand(GPIOE_IDR_A , n)
void RCC_Configuration(void);//首先设置系统时钟为8MHZ
void GPIO_Configuration(void);


void delay1ms(u16 t){
    u16 i,j;
	   for(i=0;i0;j++);
 }
int main(void)
{
	
	float DIV;
	u16 M,F,BRR;
  u32 Bound;	
	u8 data='A';
	RCC_Configuration();
GPIO_Configuration();

	//USART1模块的设置;
	//1.  USART_CR1置位UE使能、 2.  USART_CR1的M位定义字长、    3.  USART_CR2中STOP停止位的位数、
	//4.  USART_CR1中的TE位、   5.  USART_BRR寄存器选择波特率、 6.  把要发送的数据写入USART_DR寄存器中
	
	
	USART1->CR1|=(1<<13);
	USART1->CR1&=~(1<<12);//M=0; 一个起始位,8个数据位,n个停止位。
	
	USART1->CR2|=~(3<<12);//1个停止位
	USART1->CR1 |=(1<<3);//TE位使能;
	//;
	Bound=9600;//设定波特率值是9600
	DIV=(float)(72*1000*1000/(Bound*16));//USARTDIV整数
	M=DIV;//USARTDIV整数
  F=(DIV-M)*16;//USARTDIV小数位
	BRR=(M<<4)| F;//把波特率计算值给BRR寄存器
	USART1->BRR=BRR;//把波特率计算值给BRR寄存器
	
	
	

	//发送一个字符'A'到USART1的TXD  ,把要发送的数据写入USART_DR寄存器中
	for(F=0;F<20;F++){
		
		USART1->DR=data;
	  data++;
		while((USART1->SR&1<<6)==0);//USART_SR的TC置一,表示发送数据完成;否则没有完成;
			
	}
	
	
	
return 0;
}

void RCC_Configuration(void)//系统时钟设置,应用库函数编程过程
{
	//----------使用外部RC晶振-----------
	RCC_DeInit();			//初始化为缺省值
	RCC_HSEConfig(RCC_HSE_ON);	//使能外部的高速时钟 
	while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);	//等待外部高速时钟使能就绪
	
	//FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);	//Enable Prefetch Buffer
	//FLASH_SetLatency(FLASH_Latency_2);		//Flash 2 wait state
	
	RCC_HCLKConfig(RCC_SYSCLK_Div1);		//HCLK = SYSCLK
	RCC_PCLK2Config(RCC_HCLK_Div1);			//PCLK2 =  HCLK
	RCC_PCLK1Config(RCC_HCLK_Div2);			//PCLK1 = HCLK/2
	RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);	//PLLCLK = 8MHZ * 9 =72MHZ,系统给外设的时钟fpclkx
	RCC_PLLCmd(ENABLE);			//Enable PLLCLK

	while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);	//Wait till PLLCLK is ready
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);	//Select PLL as system clock
	while(RCC_GetSYSCLKSource()!=0x08);		//Wait till PLL is used as system clock source
	
	//---------打开相应外设时钟--------------------
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	//使能APB2外设的GPIOA的时钟	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);	//使能APB2外设的GPIOC的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	
	//GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);	 
		 
}

void GPIO_Configuration(void)//复用引脚设置
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* Configure USARTx_Tx as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//复用上拉
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Configure USARTx_Rx as input floating */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//浮空输入
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

}


 
  
STM32 USART寄存器方式编程_第1张图片

你可能感兴趣的:(※【stm32】)