单片机学习小组
直播中

的撒的

9年用户 724经验值
擅长:可编程逻辑
私信 关注

如何用HAL库及中断控制LED灯?

如何用HAL库及中断控制LED灯?
如何用DMA向上位机发送信息?

回帖(1)

徐娟

2022-1-20 14:43:45
一,用MX软件和HAL库进行初步的编写,并用高低电平控制LED灯亮灭

1 用STMCUBEmx对要求进行输入
在软件打开的初始界面里面选择FILE新建工程
在出现的下列中搜索我们使用的STM32F103C8芯片双击进入编辑
在接下来出现的界面里面选择第一个分支里面的SYS将里面 Debug选择为以下内容
然后在RCC分支里面的HSE更改为如下
然后点进GPIO分支将我们控制开关和LED灯的串口设置为输出也就是OUTPUT以及外部中断我选择的是PB7为开关,PA2为LED灯。

然后进入CLOCK窗口里面,选择PLLCLK改成72Mhz

然后进入Project配置界面,配置好自己的名称和路径然后在IDE栏选择为MDK-ARM
然后选择初始化文件就可以了,然后点击右上角的生成

2 更改main.c里面的内容
打开项目所在的文件夹打开项目在主函数前面用下列函数

  void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
    GPIO_PinState b7_pin = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7);  // 读取b7的状态
    b7_pin=1-b0_pin;
    switch (GPIO_Pin){//判断引脚
        case GPIO_PIN_7:
            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2,1-b0_pin);  // 将a2写入与b7相同的电位
            break;
    }
   
}

3. 烧录并运行
然后进行烧录。在进行运行结果如下

二 中断实现串口通信

也是使用MX软件新建工程和以上一样的配置过程
SYS

RCC

然后在左边的第四个分支里面选择USART1里面配置如下
然后对project进行配置也是和以上一样的
2 在keil中打开项目对main.c进行相应的更改
打开main.c文件,在头文件调用 下面加入以下内容
uint8_t aRxBuffer;//接收缓冲中断uint8_t Uart1_RxBuff[256];//接收缓冲uint8_t Uart1_Rx_Cnt=0;//接收缓冲计数uint8_t cAlmStr[; 然后在main函数之前写入回调函数

  void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  if(Uart1_Rx_Cnt >= 255)  //溢出判断
    {
        Uart1_Rx_Cnt = 0;
        memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff));
        HAL_UART_Transmit(&huart1, (uint8_t *)&cAlmStr, sizeof(cAlmStr),0xFFFF);   
    }
    else
    {
        Uart1_RxBuff[Uart1_Rx_Cnt++] = aRxBuffer;   //接收数据转存
   
        if((Uart1_RxBuff[Uart1_Rx_Cnt-1] == 0x0A)||(Uart1_RxBuff[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位
        {
            HAL_UART_Transmit(&huart1, (uint8_t *)&Uart1_RxBuff, Uart1_Rx_Cnt,0xFFFF); //将收到的信息发送出去
            Uart1_Rx_Cnt = 0;
            memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff)); //清空数组
        }
    }
   
    HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);   //再开启接收中断
  }

最后在main函数里面加入以下中断函数

  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();
    //接收中断函数
    HAL_UART_Receive_IT(&huart1,(uint8_t*)&aRxBuffer,1);
3 最后进行烧录,然后在野火串口助手里面进行手动输入数据结果如下

三 使用DMA向上位发送信息

使用MX文件创建新工程,在选择STM32F103C8Tx双击进去,在第四个分支里面点出来将芯片的PA9和PA10分别选择为TX和RX,然后在左边mode里面选择Asynchronous,然后添加两个分别为TX和RX的引脚
然后配置project里面输入名字和路径,以及将IDE改为
MDK-ARM
还有选择初始化文件,生成项目
然后去keil里面打开工程去main.c里面的主函数里面的while循环里面的内容加入以下

   uint8_t send_char[;
    HAL_UART_Transmit_DMA(&huart1,(uint8_t *)send_char,0xc);
        HAL_Delay(500);
然后对hex文件进行烧录,并进行运行结果如下

达成用DMA连续发送串口通信
四 总结

通过使用STMCUBEMX软件调用hal库函数进行简单的程序生成对led灯进行开关的控制以及中断,DMA的串口通信方式学到了通过触发中断来得到我们想要的结果。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分