STM32C8T6实现微秒延时函数delay_us
/* USER CODE BEGIN 0 */
void delay_us(uint32_t ii)
{uint32_t temp;SysTick->LOAD=ii*8;SysTick->VAL=0x00;SysTick->CTRL=0x01;//2号位1使用内核时钟do{temp=SysTick->CTRL;}while(temp&0x01&&!(temp&(1<<16)));SysTick->CTRL=0X00;SysTick->VAL=0X00;
}
/* USER CODE END 0 *//*** @brief The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 *///HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,1);delay_us(1);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,0);delay_us(1);//}/* USER CODE END 3 */
}
说明:这里虽然是理论上延时1um,但是实际上使用keil arm模拟使用了20um那个样子(但是奇怪的是使用Proteus 8.15模式的时候模拟1s时间,Proteus很接近1s,使用了2s,而是不是20s)
在实际使用C8T6的时候1s,单片式实际花费10s,可见这个函数很不严谨。远远不如HAL_DELAY()函数来的严谨(后来发现这个函数可能是准确的---但如果是准确的为什么产生1s时间时候单片机里面不对?难道是单片机有问题?这就涉及到测量单片机晶振频率的问题)
进一步追踪发现:即使使用定时器来产生1us的事情,keil arm也还是无法准确模拟时间,因此更有可能是keil arm软件无法准确模拟us时间,可能软件模拟本身需要很多us吧。那么也许代表着:这个函数可以准确计算时间
本实验采用外部高速时钟8MHZ,systemtick时钟频率8MHZ(没有使用72MHZ)