STM32SYSTEM文件夹.docx
- 文档编号:9419781
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:18
- 大小:21.11KB
STM32SYSTEM文件夹.docx
《STM32SYSTEM文件夹.docx》由会员分享,可在线阅读,更多相关《STM32SYSTEM文件夹.docx(18页珍藏版)》请在冰豆网上搜索。
STM32SYSTEM文件夹
SYSTEM文件夹介绍
1.delay文件夹
1.1delay.c文件
源码如下:
#include
#include"delay.h"
staticu8fac_us=0;//us延时倍乘数
staticu16fac_ms=0;//ms延时倍乘数
//初始化延迟函数
//SYSTICK的时钟固定为HCLK时钟的1/8
//SYSCLK:
系统时钟
voiddelay_init(u8SYSCLK)
{
SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟HCLK/8
fac_us=SYSCLK/8;
fac_ms=(u16)fac_us*1000;
}
//延时nms
//注意nms的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对72M条件下,nms<=1864
voiddelay_ms(u16nms)
{
u32temp;
SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
SysTick->VAL=0x00;//清空计数器
SysTick->CTRL=0x01;//开始倒数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!
(temp&(1<<16)));//等待时间到达
SysTick->CTRL=0x00;//关闭计数器
SysTick->VAL=0X00;//清空计数器
}
//延时nus
//nus为要延时的us数.
voiddelay_us(u32nus)
{
u32temp;
SysTick->LOAD=nus*fac_us;//时间加载
SysTick->VAL=0x00;//清空计数器
SysTick->CTRL=0x01;//开始倒数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!
(temp&(1<<16)));//等待时间到达
SysTick->CTRL=0x00;//关闭计数器
SysTick->VAL=0X00;//清空计数器
}
函数功能及调用:
1>.delay_init();
SYSTICK时钟初始化,形参为系统时钟(72M)。
2>.delay_ms(u16nms);
1毫秒延时,形参为延时毫秒数。
3>.delay_us(u32nus);
1微秒延时,形参为延时微秒数。
:
形参不要超过1800。
1.2delay.h文件
源码如下:
#ifndef__DELAY_H
#define__DELAY_H
#include
voiddelay_init(u8SYSCLK);
voiddelay_ms(u16nms);
voiddelay_us(u32nus);
#endif
2.sys文件夹
2.1sys.c文件
1>源码如下:
#include
#include"sys.h"
//设置向量表偏移地址
//NVIC_VectTab:
基址
//Offset:
偏移量
//CHECKOK
//091207
voidMY_NVIC_SetVectorTable(u32NVIC_VectTab,u32Offset)
{
//检查参数合法性
assert_param(IS_NVIC_VECTTAB(NVIC_VectTab));
assert_param(IS_NVIC_OFFSET(Offset));
SCB->VTOR=NVIC_VectTab|(Offset&(u32)0x1FFFFF80);//设置NVIC的向量表偏移寄存器
//用于标识向量表是在CODE区还是在RAM区
}
//设置NVIC分组
//NVIC_Group:
NVIC分组0~4总共5组
//CHECKOK
//091209
voidMY_NVIC_PriorityGroupConfig(u8NVIC_Group)
{
u32temp,temp1;
temp1=(~NVIC_Group)&0x07;//取后三位
temp1<<=8;
temp=SCB->AIRCR;//读取先前的设置
temp&=0X0000F8FF;//清空先前分组
temp|=0X05FA0000;//写入钥匙
temp|=temp1;
SCB->AIRCR=temp;//设置分组
}
//设置NVIC
//NVIC_PreemptionPriority:
抢占优先级
//NVIC_SubPriority:
响应优先级
//NVIC_Channel:
中断编号
//NVIC_Group:
中断分组0~4
//注意优先级不能超过设定的组的范围!
否则会有意想不到的错误
//组划分:
//组0:
0位抢占优先级,4位响应优先级
//组1:
1位抢占优先级,3位响应优先级
//组2:
2位抢占优先级,2位响应优先级
//组3:
3位抢占优先级,1位响应优先级
//组4:
4位抢占优先级,0位响应优先级
//NVIC_SubPriority和NVIC_PreemptionPriority的原则是,数值越小,越优先
//CHECKOK
//100329
voidMY_NVIC_Init(u8NVIC_PreemptionPriority,u8NVIC_SubPriority,u8NVIC_Channel,u8NVIC_Group)
{
u32temp;
u8IPRADDR=NVIC_Channel/4;//每组只能存4个,得到组地址
u8IPROFFSET=NVIC_Channel%4;//在组内的偏移
IPROFFSET=IPROFFSET*8+4;//得到偏移的确切位置
MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组
temp=NVIC_PreemptionPriority<<(4-NVIC_Group);
temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
temp&=0xf;//取低四位
if(NVIC_Channel<32)NVIC->ISER[0]|=1< elseNVIC->ISER[1]|=1<<(NVIC_Channel-32); NVIC->IPR[IPRADDR]|=temp< } //外部中断配置函数 //只针对GPIOA~G;不包括PVD,RTC和USB唤醒这三个 //参数: GPIOx: 0~6,代表GPIOA~G;BITx: 需要使能的位;TRIM: 触发模式,1,下升沿;2,上降沿;3,任意电平触发 //该函数一次只能配置1个IO口,多个IO口,需多次调用 //该函数会自动开启对应中断,以及屏蔽线 //待测试... voidEx_NVIC_Config(u8GPIOx,u8BITx,u8TRIM) { u8EXTADDR; u8EXTOFFSET; EXTADDR=BITx/4;//得到中断寄存器组的编号 EXTOFFSET=(BITx%4)*4; RCC->APB2ENR|=0x01;//使能io复用时钟 AFIO->EXTICR[EXTADDR]&=~(0x000F< ! ! AFIO->EXTICR[EXTADDR]|=GPIOx< //自动设置 EXTI->IMR|=1< //EXTI->EMR|=1< ) if(TRIM&0x01)EXTI->FTSR|=1< if(TRIM&0x02)EXTI->RTSR|=1< } //不能在这里执行所有外设复位! 否则至少引起串口不工作. //把所有时钟寄存器复位 //CHECKOK //091209 voidMYRCC_DeInit(void) { RCC->APB1RSTR=0x00000000;//复位结束 RCC->APB2RSTR=0x00000000; RCC->AHBENR=0x00000014;//睡眠模式闪存和SRAM时钟使能.其他关闭. RCC->APB2ENR=0x00000000;//外设时钟关闭. RCC->APB1ENR=0x00000000; RCC->CR|=0x00000001;//使能内部高速时钟HSION RCC->CFGR&=0xF8FF0000;//复位SW[1: 0],HPRE[3: 0],PPRE1[2: 0],PPRE2[2: 0],ADCPRE[1: 0],MCO[2: 0] RCC->CR&=0xFEF6FFFF;//复位HSEON,CSSON,PLLON RCC->CR&=0xFFFBFFFF;//复位HSEBYP RCC->CFGR&=0xFF80FFFF;//复位PLLSRC,PLLXTPRE,PLLMUL[3: 0]andUSBPRE RCC->CIR=0x00000000;//关闭所有中断 //配置向量表 #ifdefVECT_TAB_RAM MY_NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0); #else MY_NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0); #endif } //THUMB指令不支持汇编内联 //采用如下方法实现执行汇编指令WFI //CHECKOK //091209 __asmvoidWFI_SET(void) { WFI; } //进入待机模式 //checkok //091202 voidSys_Standby(void) { SCB->SCR|=1<<2;//使能SLEEPDEEP位(SYS->CTRL) RCC->APB1ENR|=1<<28;//使能电源时钟 PWR->CSR|=1<<8;//设置WKUP用于唤醒 PWR->CR|=1<<2;//清除Wake-up标志 PWR->CR|=1<<1;//PDDS置位 WFI_SET();//执行WFI指令 } //后备寄存器写入操作 //reg: 寄存器编号 //reg: 要写入的数值 ////checkok ////091202 //voidBKP_Write(u8reg,u16dat) //{ //RCC->APB1ENR|=1<<28;//使能电源时钟 //RCC->APB1ENR|=1<<27;//使能备份时钟 //PWR->CR|=1<<8;//取消备份区写保护 //switch(reg) //{ //case1: //BKP->DR1=dat; //break; //case2: //BKP->DR2=dat; //break; //case3: //BKP->DR3=dat; //break; //case4: //BKP->DR4=dat; //break; //case5: //BKP->DR5=dat; //break; //case6: //BKP->DR6=dat; //break; //case7: //BKP->DR7=dat; //break; //case8: //BKP->DR8=dat; //break; //case9: //BKP->DR9=dat; //break; //case10: //BKP->DR10=dat; //break; //} //} //系统软复位 //CHECKOK //091209 voidSys_Soft_Reset(void) { SCB->AIRCR=0X05FA0000|(u32)0x04; } //JTAG模式设置,用于设置JTAG的模式 //mode: jtag,swd模式设置;00,全使能;01,使能SWD;10,全关闭; //CHECKOK //100818 voidJTAG_Set(u8mode) { u32temp; temp=mode; temp<<=25; RCC->APB2ENR|=1<<0;//开启辅助时钟 AFIO->MAPR&=0XF8FFFFFF;//清除MAPR的[26: 24] AFIO->MAPR|=temp;//设置jtag模式 } //系统时钟初始化函数 //pll: 选择的倍频数,从2开始,最大值为16 //CHECKOK //091209 voidStm32_Clock_Init(u8PLL) { unsignedchartemp=0; MYRCC_DeInit();//复位并配置向量表 RCC->CR|=0x00010000;//外部高速时钟使能HSEON while(! (RCC->CR>>17));//等待外部时钟就绪 RCC->CFGR=0X00000400;//APB1=DIV2;APB2=DIV1;AHB=DIV1; PLL-=2;//抵消2个单位 RCC->CFGR|=PLL<<18;//设置PLL值2~16 RCC->CFGR|=1<<16;//PLLSRCON FLASH->ACR|=0x32;//FLASH2个延时周期 RCC->CR|=0x01000000;//PLLON while(! (RCC->CR>>25));//等待PLL锁定 RCC->CFGR|=0x00000002;//PLL作为系统时钟 while(temp! =0x02)//等待PLL作为系统时钟设置成功 { temp=RCC->CFGR>>2; temp&=0x03; } } 函数功能及调用: 1>.MY_NVIC_SetVectorTable(u32NVIC_VectTab,u32Offset); 该函数用来配置中断向量表基址和偏移量,决定是在哪个区域,当在RAM中调试代码时,需要把中断向量表放到RAM中就需要这个函数配置。 一般被其他函数调用。 2>.MY_NVIC_PriorityGroupConfig(u8NVIC_Group); 该函数为NVIC的分组函数,参数为要设置的分组号(0~4)。 3>.MY_NVIC_Init(u8NVIC_PreemptionPriority,u8NVIC_SubPriority,u8NVIC_Channel,u8NVIC_Group); 该函数为NVIC的设置函数,有4个参数,分别为: NVIC_PreemptionPriority、NVIC_SubPriority、NVIC_Channel、NVIC_Group。 第一个参数NVIC_PreemptionPriority为中断抢占优先级数值,第二个参数NVIC_SubPriority为中断子优先级数值,前两个参数的值必须在规定范围内,否则也可能产生意想不到的错误。 第三个参数NVIC_Channel为中断的编号(范围为0~59),最后一个参数NVIC_Group为中断分组设置(范围为0~4)。 4>.Ex_NVIC_Config(u8GPIOx,u8BITx,u8TRIM)该函数 该函数完成对外部中断的配置,该函数有3个参数: GPIOx为GPIOA~G(0~6),在sys.h里面有定义。 代表要配置的IO口。 BITx则代表这个IO口的第几位。 TRIM为触发方式,低2位有效(0x01代表下降触发;0x02代表上升沿触发;0x03代表任意电平触发); 5>.MYRCC_DeInit(void); 该函数实现外设的复位,并关断所有中断,同时调用向量表配置函数MY_NVIC_SetVectorTable,配置中断向量表。 6>.__asmvoidWFI_SET(void); 该函数实现对汇编语言的调用。 7>.Sys_Standby(void);Sys_Soft_Reset(void);JTAG_Set(u8mode); 这几个函数实现待机,软件复位,以及对JTAG引脚的设置。 8>.Stm32_Clock_Init(u8PLL); 该函数用来设置系统时钟,一般倍频数PLL=9,时钟为71M。 最大可以设置PLL=12。 3.Usart文件夹 3.1usart.c文件。 源码如下: #include"sys.h" #include"usart.h" #if1 #pragmaimport(__use_no_semihosting) //标准库需要的支持函数 struct__FILE { inthandle; /*Whateveryourequirehere.Iftheonlyfileyouareusingis*/ /*standardoutputusingprintf()fordebugging,nofilehandling*/ /*isrequired.*/ }; /*FILEistypedef’dinstdio.h.*/ FILE__stdout; //定义_sys_exit()以避免使用半主机模式 _sys_exit(intx) { x=x; } //重定义fputc函数 intfputc(intch,FILE*f) { while((USART1->SR&0X40)==0);//循环发送,直到发送完毕 USART1->DR=(u8)ch; returnch; } #endif //end ////////////////////////////////////////////////////////////////// #ifdefEN_USART1_RX//如果使能了接收 //串口1中断服务程序 //注意,读取USARTx->SR能避免莫名其妙的错误 u8USART_RX_BUF[64];//接收缓冲,最大64个字节. //接收状态 //bit7,接收完成标志 //bit6,接收到0x0d //bit5~0,接收到的有效字节数目 u8USART_RX_STA=0;//接收状态标记 voidUSART1_IRQHandler(void) { u8res; if(USART1->SR&(1<<5))//接收到数据 { res=USART1->DR; if((USART_RX_STA&0x80)==0)//接收未完成 { if(USART_RX_STA&0x40)//接收到了0x0d { if(res! =0x0a)USART_RX_STA=0;//接收错误,重新开始 elseUSART_RX_STA|=0x80;//接收完成了 }else//还没收到0X0D { if(res==0x0d)USART_RX_STA|=0x40; else { USART_RX_BUF[USART_RX_STA&0X3F]=res; USART_RX_STA++; if(USART_RX_STA>63)USART_RX_STA=0;//接收数据错误,重新开始接收 } } } } } #endif //初始化IO串口1 //pclk2: PCLK2时钟频率(Mhz) //bound: 波特率 //CHECKOK //091209 voiduart_init(u32pclk2,u32bound) { floattemp; u16mantissa; u16fraction; temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV mantissa=temp;//得到整数部分 fraction=(temp-mantissa)*16;//得到小数部分 mantissa<<=4; mantissa+=fraction; RCC->APB2ENR|=1<<2;//使能PORTA口时钟 RCC->APB2ENR|=1<<14;//使能串口时钟 GPIOA->CRH=0X444444B4;//IO状态设置 RCC->APB2RSTR|=1<<14;//复位串口1 RCC->APB2RSTR&=~(1<<14);//停止复位 //波特率设置 USART1->BRR=mantissa;//波特率设置 USART1->CR1|=0X200C;//1位停止,无校验位. #ifdefEN_USART1_RX//如果使能了接收 //使能接收中断 USART1->CR1|=1<<8;//PE中断使能 USART1->CR1|=1<<5;//接收缓冲区非空中断使能 MY_NVIC_Init(3,3,USART1_IRQChannel,2);//组2,最低优先级 #endif } 函数功能及调用: 1>.USART1_IRQHandler(void)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STM32SYSTEM 文件夹