首页 > 编程知识 正文

嵌入式系统开发基础教程,嵌入式开发用什么系统

时间:2023-05-03 21:55:33 阅读:205919 作者:1765

嵌入式系统开发 快捷键 alt + / :代码提示ctrl + 鼠标左: 查看代码实现alt + ←: 返回跳转前的代码 项目1-Hello world

1、创建STM32项目

2、选择型号

3、配置项目名称

4、项目初始化概览

5、根据需求,查看文档引脚说明

打开提供的:MB1296D-01.PDF,次出是控制LED灯,因此找到LED等引脚相关信息。

6、到CUBE IDE配置对应的模式

分别配置PA5、PB5、PB6、PB7的模式为输出,高电平有效等。

7、保存修改

保存会提示弹出一些对话框,都选择Yes

8、创建完成

查看对应的文件结构,其中CMSIS是ARM等定义的HAL,硬件抽象层。

查看main.c

9、修改代码,实现针脚输出高电平

10、重新编译

编译,看是否报错

11、调试

确定

查看断点

12、修改代码使得蓝灯、绿灯闪,红灯常亮。

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(); MX_RTC_Init(); MX_SPI1_Init(); MX_USART2_UART_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { // write pin led HAL_GPIO_WritePin(LD2_RED_GPIO_Port, LD2_RED_Pin, GPIO_PIN_RESET); // flash blue led HAL_GPIO_TogglePin(LD3_BLUE_GPIO_Port, LD3_BLUE_Pin); // flash green led HAL_GPIO_TogglePin(LD_GREEN_GPIO_Port, LD_GREEN_Pin); HAL_Delay(1000); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */}

13、查看结果

注意:调试接口接入的位置

项目2-按钮实现闪灯

需求:板上有两个按钮,一蓝和一黑。黑色是重置,而蓝色是给用户自定义的。接下实现按钮控制LED灯的亮与灭。

1、观察电路图

发现需要将PB2口设置为输入悬空

2、CUBE IDE设置对应GPIO口的模式

3、编码读取按钮状态

int main(void){// ... 省略 while (1) { // GPIO_PIN_RESET 低电平 // GPIO_PIN_SET 高电平 // Anti-Hunting (Remember) if (HAL_GPIO_ReadPin(B2_BUTTON_GPIO_Port, B2_BUTTON_Pin) == GPIO_PIN_RESET) { HAL_Delay(15); if (HAL_GPIO_ReadPin(B2_BUTTON_GPIO_Port, B2_BUTTON_Pin) == GPIO_PIN_RESET) { HAL_GPIO_TogglePin(LD3_BLUE_GPIO_Port, LD3_BLUE_Pin); HAL_GPIO_TogglePin(LD_GREEN_GPIO_Port, LD_GREEN_Pin); // Release inspection while (HAL_GPIO_ReadPin(B2_BUTTON_GPIO_Port, B2_BUTTON_Pin) == GPIO_PIN_RESET); } } /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */}

需要注意的是:

抖动消除:代码中采用双if加延时,抖动消除。消抖是为了避免在按键按下或是抬起时电平剧烈抖动带来的影响。

松手检测:代码中的while用来实现松手检测。一般传统的松手检测都是用一个while死循环等待松手的

4、小总结

实现按钮控制LED灯的时候,主要注意按钮状态的读取。在对按钮状态读取的时候,需要注意「抖动消除」和「松手检测」来线程按下按钮的机械特性。 项目3-按钮控制(中断方式)

需求:用中断方式,控制灯的闪烁快慢。

此处有两个疑问,一是中断处理函数在哪里;二是如果控制灯闪烁的快慢。

1、设置按钮的输入输出方式为中断模式

2、其中GPIO mode 的介绍如下

由于按钮电路按下的时候是触发下降沿,因此我们需要设置为下降沿中断触发。

3、NVIC

设置NVIC中断为运行,PB2对应EXTI2

4、中断通道

5、进入函数内部

6、重写函数(此函数会在中断发送的时候执行)

总结4/5/6三步就是

stm32l0xx_it.c中的EXTI2_3_IRQHandler是用于处理EXTI2和EXTI3的中断请求在本项目中调用了HAL_GPIO_EXTI_IRQHandler函数对指定引脚中断进行处理HAL_GPIO_EXTI_IRQHandler内部会先判断该引脚中断是否可用,可用就继续执行HAL_GPIO_EXTI_Callback,真正的中断处理函数在stm32l0xx_it.c中的HAL_GPIO_EXTI_Callback是weak修饰,说明可用被重写这里直接把这部分函数搬到main.c的用户自定义区域,重写即可

7、总结:只需要将函数HAL_GPIO_EXTI_Callback复制到main函数中,重写即可

// 全局变量int flag=0;// 主函数int main(void){ while (1) { HAL_GPIO_TogglePin(LD3_BLUE_GPIO_Port, LD3_BLUE_Pin); if (flag == 0) { HAL_Delay(150); } else { HAL_Delay(500); } }}// 中断处理函数void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ // 简单将flag反转flag = !flag;} 项目4-按钮控制串口通信(中断方式)

需求:按钮按下,同串口通信给PC发送Hello

1、设置串口通信信息

2、编码

在中断回调函数调用串口发送函数

// 全局函数uint8_t aTxbuf[] = {'h','e','l','l','o'};// 主函数int main(void) { // ... 无需修改逻辑}// 中断回调处理函数void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { // 串口写,5个字符HAL_UART_Transmit(&huart2, aTxbuf, 5, 1000); flag = !flag;}

3、使用串口调试助手读取数据

此处需要注意:波特率,奇偶校验,数据位需要与Cube IDE中配置的保存一致。

下载只需要百度「XCOM串口助手」即可

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。