#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;i
for(j=1000;j>0;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);
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』