stm32f4 库函数 printf使用dma吗

stm32f4 库函数 printf使用dma吗,第1张

int fputc(int ch, FILE f)

{

OS_ERR err;

CPU_TS ts;

Dbg_printf_time[Dbg_printf_cnt++] = STK_VAL_REG; //进入函数前读取systick的寄存器

Dbg_printf_inter[Dbg_printf_cnt] = Dbg_printf_time[Dbg_printf_cnt-2] - Dbg_printf_time[Dbg_printf_cnt-1];//用刚读取的寄存器值减去上一次退出该函数的寄存器值,从而得到两次进入该函数之间的时间

while (HAL_UART_Transmit_IT(&huart, (uint8_t )&ch, 1) != HAL_OK)

{

OSTaskSemPend(10, OS_OPT_PEND_BLOCKING, &ts, &err);

//check “err”

}

Dbg_printf_time[Dbg_printf_cnt++] = STK_VAL_REG; //退出函数前读取systick的寄存器值

Dbg_printf_inter[Dbg_printf_cnt] = Dbg_printf_time[Dbg_printf_cnt-2] - Dbg_printf_time[Dbg_printf_cnt-1];//用刚读取的寄存器值减去进入该函数的寄存器值,从而得到两次进入该函数之间的时间

if (Dbg_printf_cnt > 90)

{

Dbg_printf_cnt = 1;

}

return ch;

}

首先取决于你的时钟频率选定为多少。

以24位的SysTick定时器为例,在35版本的库函数(该版本简化了对该计时器的配置函数)中,调用函数 SystemInit(); 初始化SysTick计时器为STM32主时钟的8分频,假设主频达到72MHz

则此时计时器的频率为9MHz,即1秒可 向下记数 9000000(9M)次。

f=9MHz,所以周期为T=1/f,即1/9000000。

再调用SysTick_Config(SystemCoreClock / X) (X表示一个数,填入多少就能获得 1/X 秒数)

delay中调用这些便可实现精确计时。

例如

void Delay(vu32 count)

{ 全局变量A = count };

然后再在stm32f10x_itc 文件中的定义

void SysTick_Handler(void)

{

if(全局变量!=0)

全局变量--;

}

就可以实现计时了。

这是STM32官方库给出的配制系统定时器中断的库函数:

static __INLINE uint32_t SysTick_Config(uint32_t ticks){

if (ticks > SysTick_LOAD_RELOAD_Msk) return (1);

SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;

NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);

SysTick->VAL = 0;

SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |

SysTick_CTRL_TICKINT_Msk |

SysTick_CTRL_ENABLE_Msk;

return (0);

}

只需要把形参ticks赋值为50就能让系统定时器每20ms中断一次。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/12180712.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-21
下一篇2023-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存