Appearance
SYSTEM文件介绍
这个是正点原子用来快速构建文件的文件夹
- sys文件夹
- delay文件夹
- usart文件夹
sys文件
delay文件
使用的SysTick定时器, 是一个包含在内核里面的计时器, 是一个24位的递减计数器
第二个位段被stm32修改了, 变为分频器控制
c
//初始化延迟函数
//当使用ucos的时候,此函数会初始化ucos的时钟节拍
//SYSTICK的时钟固定为AHB时钟
//SYSCLK:系统时钟频率,单位是M(直接传入32就可以了)
void delay_init(u8 SYSCLK)
{
#if SYSTEM_SUPPORT_OS //如果需要支持OS.
u32 reload;
#endif
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);//SysTick频率为HCLK
fac_us=SYSCLK; //不论是否使用OS,fac_us都需要使用
#if SYSTEM_SUPPORT_OS //如果需要支持OS.
reload=SYSCLK; //每秒钟的计数次数 单位为K
reload*=1000000/delay_ostickspersec; //根据delay_ostickspersec设定溢出时间
//reload为24位寄存器,最大值:16777216,在72M下,约合0.233s左右
fac_ms=1000/delay_ostickspersec; //代表OS可以延时的最少单位
SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;//开启SYSTICK中断
SysTick->LOAD=reload; //每1/OS_TICKS_PER_SEC秒中断一次
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK
#else
#endif
}
第一行是为了清空设置
第二行设置时钟源
第三行设置一秒需要计数多少次的计算参数, 这时候的时钟频率是9MHz, 数9次就是1us
c
//延时nus
//nus为要延时的us数.
//nus:0~190887435(最大值即2^32/fac_us@fac_us=22.5)
void delay_us(u32 nus)
{
u32 ticks;
u32 told,tnow,tcnt=0;
u32 reload=SysTick->LOAD; //LOAD的值
ticks=nus*fac_us; //需要的节拍数
told=SysTick->VAL; //刚进入时的计数器值
while(1)
{
tnow=SysTick->VAL;
if(tnow!=told)
{
if(tnow<told)tcnt+=told-tnow; //这里注意一下SYSTICK是一个递减的计数器就可以了.
else tcnt+=reload-tnow+told;
told=tnow;
if(tcnt>=ticks)break; //时间超过/等于要延迟的时间,则退出.
}
};
}
c
//延时nms
//nms:要延时的ms数
void delay_ms(u16 nms)
{
u32 i;
for(i=0;i<nms;i++) delay_us(1000);
}
uart文件
- 避免使用半主机模式
简单说就是通过仿真器实现开发板在电脑上的输入输出
半主机模式(semi-hosting mode)是一种调试方法,在这种模式下,单片机和主机之间可以实现双向通信,以便进行调试。半主机模式通过一组定义好的软件指令(如 SVC)来实现,这些指令通过程序控制生成异常。应用程序调用相应的半主机调用,然后调试代理处理该异常,最终将信息传输到主机,以便进行调试和分析。半主机模式通常用于调试程序或者进行单片机的初始启动和调试。但是使用半主机模式会增加程序开销和调试代理的复杂性,并且可能会影响程序的执行效率和稳定性。因此,在单片机设计中应尽量避免使用半主机模式,而应该选择更加稳定、高效的调试方法。
- 微库法
直接使用移植好的微库
- 代码法
一个预处理, 两个定义, 三个函数
- 预处理是#pragma import(__use_no_semihosting), 保证C库不使用半主机模式
- 定义__FILE__结构体, 避免HAL库报错
- 定义FILE__stdio, 避免报错
- 实现__ttywrch, _sys_exit和_sys_command_string三个函数
c
//////////////////////////////////////////////////////////////////
//加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
USART1->DR = (u8) ch;
return ch;
}
#endif