CUBEMX实现微秒毫秒延迟

基于HAL库实现微妙毫秒延迟

使用时仅在main函数里添加delay_init(168),进行初始化即可即可。

使用此方法,不可使用HAL_Delay()函数
使用此方法,不可使用HAL_Delay()函数
使用此方法,不可使用HAL_Delay()函数

delay.c

#include "delay.h"
/*
适用于STM32F407系列
*/
static uint8_t  fac_us=0;							//us延时倍乘数			   
static uint16_t fac_ms=0;							//ms延时倍乘数,在os下,代表每个节拍的ms数

//初始化延迟函数
//SYSTICK的时钟固定为AHB时钟的1/8
//SYSCLK:系统时钟频率
void delay_init(uint8_t SYSCLK)
{
	HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);
	fac_us=SYSCLK/8;						//不论是否使用OS,fac_us都需要使用
	fac_ms=(uint16_t)fac_us*1000;				//非OS下,代表每个ms需要的systick时钟数   
}								    
 /****************************
 ** 定时us
 ** nus: 需要定时的微秒数
 **延时nus
 **nus为要延时的us数.	
 **注意:nus的值,不要大于798915us(最大值即2^24/fac_us@fac_us=21)
 *****************************/
void delay_us(int32_t nus) 
 {
	uint32_t temp;	    	 
	SysTick->LOAD=nus*fac_us; 				//时间加载	  		 
	SysTick->VAL=0x00;        				//清空计数器
	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数 	 
	do
	{
		temp=SysTick->CTRL;
	}while((temp&0x01)&&!(temp&(1<<16)));	//等待时间到达   
	SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
	SysTick->VAL =0X00;       				//清空计数器 
 }

 //延时nms
 //注意nms的范围
 //SysTick->LOAD为24位寄存器,所以,最大延时为:
 //nms<=0xffffff*8*1000/SYSCLK
 //SYSCLK单位为Hz,nms单位为ms
 //对168M条件下,nms<=798ms 
void delay_xms(uint16_t nms)
{
	uint32_t temp;
	SysTick->LOAD=(uint32_t)nms*fac_ms;			//时间加载(SysTick->LOAD为24bit)
	SysTick->VAL =0x00;           			//清空计数器
	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //开始倒数 
	do
	{
		temp=SysTick->CTRL;
	}while((temp&0x01)&&!(temp&(1<<16)));	//等待时间到达   
	SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器
	SysTick->VAL =0X00;     		  		//清空计数器	  	    
} 
 
 /****************************
 ** 定时ms
 ** nms: 需要定时的毫秒数
 *****************************/
 void delay_ms(int32_t nms) 
 {
	uint8_t repeat=nms/540;						//这里用540,是考虑到某些客户可能超频使用,
											//比如超频到248M的时候,delay_xms最大只能延时541ms左右了
	uint16_t remain=nms%540;
	while(repeat)
	{
		delay_xms(540);
		repeat--;
	}
	if(remain)delay_xms(remain); 
 }

delay.h

#ifndef __DELAY_H__
#define __DELAY_H__

/* 包含头文件 ----------------------------------------------------------------*/
#include "stm32f4xx_hal.h"
#include "main.h"
void delay_init(uint8_t SYSCLK);
void delay_us(int32_t nus);
void delay_xms(uint16_t nms);
void delay_ms(int32_t nms);
#endif

修改自正点原子库函数代码

您好!对于使用STM32CubeMX采集ADC数据并通过串口屏显示波形,您可以按照以下步骤进行操作: 1. 打开STM32CubeMX并创建一个新的工程,选择您使用的STM32系列的芯片型号。 2. 在"Pinout & Configuration"选项卡中,将ADC通道和串口引脚分配给合适的GPIO引脚。 3. 在"Configuration"选项卡中,配置ADC和串口的参数。您可以选择ADC的采样率、分辨率和触发方式,以及串口的波特率和数据位数等。 4. 在"Project"选项卡中,生成代码并导出到您的开发环境中。 5. 在生成的代码中,找到ADC初始化函数和串口初始化函数。您需要根据需要进行相应的配置,比如设置ADC的转换模式和通道,以及串口的参数。 6. 在主函数中,编写代码以启动ADC转换并读取数据,然后将数据通过串口发送到串口屏上。 以下是一个简单的示例代码,可以帮助您开始: ```c #include "main.h" #include "stdio.h" ADC_HandleTypeDef hadc1; UART_HandleTypeDef huart1; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART1_UART_Init(void); static void MX_ADC1_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); MX_ADC1_Init(); uint16_t adc_value; while (1) { // 启动ADC转换 HAL_ADC_Start(&hadc1); // 等待转换完成 HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY); // 读取ADC值 adc_value = HAL_ADC_GetValue(&hadc1); // 将ADC值发送到串口屏 char uart_data[20]; sprintf(uart_data, "ADC Value: %d\r\n", adc_value); HAL_UART_Transmit(&huart1, (uint8_t*)uart_data, strlen(uart_data), HAL_MAX_DELAY); // 延时一段时间 HAL_Delay(100); } } ``` 这是一个简单的示例代码,仅用于演示基本的功能。您可以根据实际需求进行修改和扩展,以适应您的项目要求。 请注意,以上代码只是一个示例,您需要根据您的具体情况进行适当的修改和调整。同时,您还需要根据您使用的具体串口屏的通信协议和数据格式进行相应的配置和处理。 希望对您有所帮助!如有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值