嵌入式系统开发入门

嵌入式系统开发

快捷键

alt + / 	:	代码提示
ctrl + 鼠标左:	  查看代码实现
alt + ←		:   返回跳转前的代码

项目1-Hello world

1、创建STM32项目

image-20210521111403510

2、选择型号

image-20210521111814227

3、配置项目名称

image-20210521111917682

4、项目初始化概览

image-20210521112239462

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

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

image-20210521112451511

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

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

image-20210521112807059

image-20210521113002755

7、保存修改

image-20210521113238272

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

image-20210521113318872

8、创建完成

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

image-20210521113955299

查看main.c

image-20210521114501936

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

image-20210521114725107

10、重新编译

image-20210521115125341

编译,看是否报错

11、调试

image-20210521115510995

确定

image-20210521115534097

查看断点

image-20210521115621195

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、查看结果

image-20210521121125979

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

项目2-按钮实现闪灯

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

stm32

1、观察电路图

stm32_button

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

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

image-20210526172502742

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、设置按钮的输入输出方式为中断模式

image-20210528110053818

2、其中GPIO mode 的介绍如下

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

3、NVIC

image-20210528110326610

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

4、中断通道

image-20210528111223866

5、进入函数内部

image-20210528111647177

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

image-20210528111840294

总结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、设置串口通信信息

image-20210602181125121

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串口助手」即可

image-20210602181723330

  • 9
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值