个人使用
仅作记录
防止遗忘
文章目录
2022-12-15 新建,基础配置,生成配置
新建,输入型号
双击型号,进入相应型号编辑窗口,如图
配置下载方式,个人使用自制ST-LINK V2下载,所以是通过SWDIO和SWCLK下载,选择Serial Wire
配置时钟,个人使用高速时钟,低速时钟暂时不使用,所以只开启高速时钟
配置晶振,个人偏好24MHZ晶振,如图配置,其他为自动生成
配置生成模式,个人使用keil编写,该模式为个人编写习惯
2022-12-15 ADC配置
选择引脚,使能ADC
配置参数(个人习惯)
2022-12-17补充:调用代码
//ADC-扫描
void ADC_saomiao(void) //ADC-扫描
{
unsigned char i,j;
if(index_adc)
{
index_adc = 0;
for(j=0;j<5;j++) //读取5次求平均值
{
for(i=0;i<3;i++) //读取3组ADC
{
HAL_ADC_Start(&hadc1); //开启ADC转换
HAL_ADC_PollForConversion(&hadc1 ,10); //等待转换完成,超时时间:50ms
adcBuf[i] += HAL_ADC_GetValue(&hadc1); //将ADC值存入数组
}
}
//处理ADC值
//取出ADC值并显示
a1_adc_value = adcBuf[0] / 5; //ADC值
A1_xs[3] = a1_adc_value / 1000 % 10 + 0x30;
A1_xs[4] = a1_adc_value / 100 % 10 + 0x30;
A1_xs[5] = a1_adc_value / 10 % 10 + 0x30;
A1_xs[6] = a1_adc_value / 1 % 10 + 0x30;
//ADC电压
v_adc_value = adcBuf[1] / 5 * (3.3 / 4096) * 2; //电压
//清空数组
adcBuf[0] = 0;
adcBuf[1] = 0;
adcBuf[2] = 0;
//停止ADC转换
HAL_ADC_Stop(&hadc1);
}
}
2022-12-17 us级延时配置(TIM3)
us级延时配置(TIM3)
调用代码
//延时初始化
void Delay_Init(void) //延时初始化
{
HAL_TIM_Base_Start_IT(&htim3); //打开定时器3中断
}
//微秒级延时
void Delay_us(uint16_t nus) //微秒级延时
{
__HAL_TIM_SET_COUNTER(&htim3, 0);
while((__HAL_TIM_GET_COUNTER(&htim3)) < nus);
}
2022-12-17 串口配置(uart1)
串口配置(个人使用习惯)
uart.c文件
unsigned char Res1_Buf[1024]; //串口1接收缓存数组
unsigned char Res1_Sign = 0; //串口1接收标志位
unsigned int Res1_Count = 0; //串口1接收数据计数器
unsigned char Res1_Flag = 0; //串口1接收数据完成标志位
//串口初始化
void Uart_Init(void) //串口初始化
{
__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE); //打开串口1接收中断
}
//串口1接收函数
void Uart1_Receiver(void) //串口1接收函数
{
unsigned char Res = 0;
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE) != RESET) //判断串口1是否接收到字节
{
HAL_UART_Receive(&huart1, &Res, 1, 1000);
Res1_Buf[Res1_Count++] = Res; //取出串口2接收到的数据并存入Res1_Buf数组中
Res1_Sign = 1; //串口1接收标志位置1
Res1_Flag = 0; //串口1接收数据完成标志位清零
}
}
//清空接收串口1数组程序
void QK_SZ1(void) //清空接收串口1数组程序
{
memset(Res1_Buf, 0,strlen((const char *)Res1_Buf)); //清零串口1数组
Res1_Count = 0;
Res1_Sign = 0;
}
uart.h文件
extern unsigned char Res1_Buf[1024]; //串口1接收缓存数组
extern unsigned char Res1_Sign; //串口1接收标志位
extern unsigned int Res1_Count; //串口1接收数据计数器
extern unsigned char Res1_Flag; //串口1接收数据完成标志位
void Uart_Init(void); //串口初始化
void Uart1_Receiver(void); //串口1接收函数
void QK_SZ1(void); //清空接收串口1数组程序
发送及重定义函数
HAL_UART_Transmit(&huart1, cmd, len, 1000); //串口发送函数(串口编号,待发送字符串,待发送字符串长度,发送等待时间)
//printf重定义,串口2 (使用时放于主函数)
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart2,(uint8_t *)&ch,1,0xff);
return ch;
}
具体配置
将Uart1_Receiver函数置于stm32f1xx_it.c的USART1_IRQHandler函数中
并屏蔽掉HAL_UART_IRQHandler函数
具体使用
if(Res1_Sign == 1) //串口1接收标志位
{
//接收到最后一个字节,再延时5ms
do{
Res1_Flag++;
HAL_Delay(1);
}while(Res1_Flag < 5); //等待串口1接收完成
Res1_Sign = 0; //串口1接收标志位清零
Res1_Flag = 0; //串口1接收数据完成标志位
//对接受的数组进行处理
Res1_Count = 0; //串口1接收数据计数器清零
}
2024-02-04 中断优先级(NVIC)
Preemption Priority:抢占优先级
Sub Priority:子优先级
1、抢占优先级:顾名思义能够抢先执行任务,即打断当前的主程序或者中断程序的运行,前去完成抢断中断。也称中断嵌套。
2、子优先级:也是从优先级或者副优先级,在抢占优先级相同的情况下不能发生中断嵌套,高级的子优先级先执行。如果低级的子优先级在执行,需要等待完成才能执行高级的子优先级,即不发生抢断。
注:
抢占优先级高的可以打断抢占优先级低的执行
子优先级高的不可以打断子优先级低的执行
数值越小,优先级越高
2024-02-05 STM32CubeMX生成工程时缺少启动文件报错
Project language : C
but MDK-ARM V5.32project generation have a problem.
keil编译报错:
0\0.sct(7): error: L6236E: No section matches selector - no section to be FIRST/LAST.
Not enough information to list image symbols.
Not enough information to list the image map.
解决办法:
将工程路径设置为全英文路径即可。
个人使用
仅作记录
防止遗忘