SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;// 关闭计数器SysTick->VAL =0;// 时间到了溢出后要记得清空}voiddelay_us(uint32_tus){ SysTick->LOAD = SystemCoreClock /1000000-1;// 设置SysTick定时器为1毫秒SysTick->VAL =0;// 设置初值为0SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;// 使能...
//_delay_us(0); //实测120ns //_delay_us(0.1); //实测150ns //_delay_us(0.5);...
#define SYSTEM_FQ 120000000//定时器的时钟频率,以120Mhz为例voiddelay_us(intcount){SysTick->LOAD=count*(SYSTEM_FQ/1000000)-1;//设定重装载值SysTick->VAL=0;// 计数归零SysTick->CTRL=SysTick_CTRL_CLKSOURCE_Msk|SysTick_CTRL_ENABLE_Msk;// 使能定时器,开始计数while((SysTick->CTRL&SysTick_CTRL...
在上述代码中,delay_us函数实现了在微秒级别进行延时操作,函数中的参数nus为需要延时的时间,函数的实现原理是通过在系统中使用中断控制器SysTick实现的。 4. 调用延时函数 在完成延时函数的编写后,我们需要在程序中调用函数。如果需要进行一段时间的延时,我们可以直接调用delay_us函数并传入需要的时间参数即可,例如: ...
delay_us_mul=SystemCoreClock/1000000; } systick配置函数如下所示,通过该函数开启sysitck。 C static void systick_config(void) { SystemCoreClockUpdate(); /* setup systick timer for 1000Hz interrupts */ if (SysTick_Config(SystemCoreClock / 1000U)){ ...
delay_1us(2); gpio_bit_set(GPIOB, GPIO_PIN_6); delay_1us(2); } /* reset I2C */ i2c_software_reset_config(I2C0, I2C_SRESET_RESET); i2c_software_reset_config(I2C0, I2C_SRESET_SET); gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | ...
void delay_us(uint32_t us); void systick_deinit(void); /* * Call by Systick interrupt server */ void systick_handler(void); #endif 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. platform_systick.c ...
Tconv = 1.5 周期 + 12.5 周期 = 14 周期 = 1us。 8.电压转换 模拟电压经过 ADC 转换后,是一个 12 位的数字值,如果通过串口以 16 进制打印出来的话,可读性比较差,那么有时候我们就需要把数字电压转换成模拟电压,也可以跟实际的模拟电压(用万用表测)对比,看看转换是否准确。
代码原本的想法是,在发送完BUFFER里面的数据之后稍作延时delay_us(2),就拉高SPI Enable(对应DSP_CS引脚)。代码用在STM32F103CBT6上没有问题,但是用在GD32F103CBT6上,意想不到的现象出现了,此时程序好像不再是顺序执行了,也就是发送完了数据之后,再执行IO拉高操作,而是数据发送和IO控制变成了并行操作,数据发送和...
打开`systick.h文件,添加delay_1us(uint32_t count)函数,如下图: 打开systick.c文件,修改systick_config函数: 原来的: voidsystick_config(void){/* setup systick timer for 1000Hz interrupts */if(SysTick_Config(SystemCoreClock /1000U)) {/* capture error */while(1) { ...