stm32---USART---主函数模块+库函数

来源:互联网 发布:matlab删除矩阵某一行 编辑:程序博客网 时间:2024/04/29 22:07



//core_cm3.c与core_cm3.h:    提供内核接口

//system_stm32f10x.c与system_stm32f10x.h:       提供系统时钟设置及总线时钟,包含SystemInit()函数
//stm32f10x.h:   (各种结构体及宏定义),提供系统寄存器的定义声明及包装内存操作
//startup_stm32f10x_hd.h:   启动文件主要是进行堆栈之类的初始化,中断向量表及中断函数定义
//stm32f10x_it.c与stm32f10x_it.h:               提供中断服务函数
//stm32f10x_conf.h 系统外设配置开关信号
//delay.h---sys.h---stm32f10x.h(包含结构体变量与寄存器相对应操作)---stm32f10x_conf.h
//system_stm32f10x.c在实现系统时钟的时候要用到PLL(锁相环),这就需要操作寄存器,寄存器都是以存储器映射的方式来访问的,所以该文件中包含了stm32f10x.h 这个头文件。
//misc.c提供外设对内核中的NVIC(中断向量控制器)的访问函数



#include <stdio.h>//包含printf调用fputc的底层实现,int fputc(int ch, FILE *f)
#include "stm32f10x.h"

void usart_init(void);
void delay_init(void);
void delay_ms(u16 nms);
void delay_us(u32 nus);



static u8  fac_us=0;//us延时倍乘数
static u16 fac_ms=0;//ms延时倍乘数


int main(void)
{
u8 flg=0;
u16 times=0; 

delay_init();
    usart_init();

while(1)
{
if(times%200==0)
{
switch(flg)
{
case 0 :
{printf("\r\n牛振兴,很好,你呢?!\r\n");break; }
case 1 :
{printf("\r\n收到请回答,fine and you ?!\r\n");break; }
default: { break; } 
}
flg=!flg;
}
times++;
delay_ms(10);   
}
}


void usart_init(void)
{
//定义串口Usart,GPIO初始化结构体
GPIO_InitTypeDef GPIO_Init_Struct;
USART_InitTypeDef USART_Init_Struct;
//打开串口及GPIO复用时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
//串口复位》》》》》》》》》》》》》》》》》》》》》串口复位在初始化之前?之后
USART_DeInit(USART1);
//GPIO及串口初始化结构体参数配置
GPIO_Init_Struct.GPIO_Pin=GPIO_Pin_9;
GPIO_Init_Struct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init_Struct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_Init_Struct);

GPIO_Init_Struct.GPIO_Pin=GPIO_Pin_10;
GPIO_Init_Struct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init_Struct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_Init_Struct);

USART_Init_Struct.USART_BaudRate = 9600;//一般设置为9600;
USART_Init_Struct.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_Init_Struct.USART_StopBits = USART_StopBits_1;//一个停止位
USART_Init_Struct.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_Init_Struct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_Init_Struct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式
//初始化串口
USART_Init(USART1,&USART_Init_Struct);
//使能串口
USART_Cmd(USART1,ENABLE);
//定义串口中断初始化结构体
//初始化中断NVIC
//开启中断
//编写中断服务函数
}


//初始化延迟函数
void delay_init()  
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//选择外部时钟  HCLK/8
fac_us=SystemCoreClock/8000000;//为系统时钟的1/8  
fac_ms=(u16)fac_us*1000;//非ucos下,代表每个ms需要的systick时钟数   
}    


//延时nus       
void delay_us(u32 nus)
{
u32 temp;      
SysTick->LOAD=nus*fac_us; //时间加载  
SysTick->VAL=0x00;        //清空计数器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //开始倒数 
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器
SysTick->VAL =0X00;       //清空计数器 
}


//延时nms
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对72M条件下,nms<=1864 
void delay_ms(u16 nms)
{   
u32 temp;   
SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00;           //清空计数器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //开始倒数  
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器
SysTick->VAL =0X00;       //清空计数器    



/*使用microLib的方法,重定义fputc函数 */
int fputc(int ch, FILE *f)
{
USART_SendData(USART1, (uint8_t) ch);


while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}
   
    return ch;
}


int GetKey (void)  { 


    while (!(USART1->SR & USART_FLAG_RXNE));


    return ((int)(USART1->DR & 0x1FF));
}
//重定义fputc函数 
//int fputc(int ch, FILE *f)
//{      
// while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
//    USART1->DR = (u8) ch;      
// return ch;
//}
0 0