STM32F051K8U6按键中断实例

2023-05-16

引言

最近要开始做毕设了,准备用STM32做一个平衡小车,好久没做过STM32的裸机项目了,做几个项目练练手,复习一下。本例程使用STM32CubeMX配套hal库来实现按键中断和串口中断。芯片用的是STM32F051K8U6。

一、按键中断

(串口发送)

硬件原理图

设置根据芯片手册,设置GPIO为对应的功能:

具体配置

在STM32中,外部中断虽然有0~15,16个,但是入口地址只有3个。看参考手册的这里: 

 

 配置串口波特率为115200Bits/s,这样通信速率会非常快。 

 

最后,生成MDK源码

 

 

我们看一下它写的代码,main.c

/**
  ******************************************************************************
  * File Name          : main.c
  * Description        : Main program body
  ******************************************************************************
  ** This notice applies to any and all portions of this file
  * that are not between comment pairs USER CODE BEGIN and
  * USER CODE END. Other portions of this file, whether 
  * inserted by the user or by software development tools
  * are owned by their respective copyright owners.
  *
  * COPYRIGHT(c) 2023 STMicroelectronics
  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *   1. Redistributions of source code must retain the above copyright notice,
  *      this list of conditions and the following disclaimer.
  *   2. Redistributions in binary form must reproduce the above copyright notice,
  *      this list of conditions and the following disclaimer in the documentation
  *      and/or other materials provided with the distribution.
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
  *      may be used to endorse or promote products derived from this software
  *      without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f0xx_hal.h"
#include "usart.h"
#include "gpio.h"

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

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_USART1_UART_Init();

  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

/** System Clock Configuration
*/
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_PeriphCLKInitTypeDef PeriphClkInit;

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = 16;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
  PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure the Systick interrupt time 
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick 
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @param  None
  * @retval None
  */
void _Error_Handler(char * file, int line)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  while(1) 
  {
  }
  /* USER CODE END Error_Handler_Debug */ 
}

#ifdef USE_FULL_ASSERT

/**
   * @brief Reports the name of the source file and the source line number
   * where the assert_param error has occurred.
   * @param file: pointer to the source file name
   * @param line: assert_param error line source number
   * @retval None
   */
void assert_failed(uint8_t* file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */

}

#endif

/**
  * @}
  */ 

/**
  * @}
*/ 

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

两个比较重要的初始化代码:

//这些都是对EXTI和USART1的一些初始化配置,比如中断优先级...

void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin : PA8 */
  GPIO_InitStruct.Pin = GPIO_PIN_8;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);

}

void MX_USART1_UART_Init(void)
{

  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

串口产生一个发生中断,会进入到我们的异常处理当中的向量处理的处理函数,对应启动文件的这里 :

 注意:

首先。我们的EXTI8一旦产生则会进入这个入口(处理函数地址): 

层层升入->

 

->-> 

 ->-> 

这个才是我们应当实现的。这里是__weak表示是一个弱符号的函数,表示其他地方同名函数可覆盖此处。这里其实是一个空函数,为了提醒你去做一个判断是不是PA8调用的函数。

不管上面那个空函数。我们在gpio.c中重写一个 HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);

HAL函数可以从Keil的Functions栏里找到; 

报这个错是因为本.c文件没加头文件

 解决方法:

自主部分: 

 

实验操作:

 

实验现象:

二、串口中断

(串口接收)

STM32CubeMX配置: 

 

跟上面的按键中断类似,详细就不赘述了。 

main.c添加部分: 

/**
  ******************************************************************************
  * File Name          : main.c
  * Description        : Main program body
  ******************************************************************************
  */

/* USER CODE BEGIN 0 */

int fputc(int ch, FILE *f)
{
	while(!(USART1->ISR & (1<<7)));
	
	USART1->TDR =ch;
	
	return ch;
}

uint8_t RX_buf[10] = {0};

/* USER CODE END 0 */

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_USART1_UART_Init();

  /* USER CODE BEGIN 2 */
  
  HAL_UART_Transmit_IT(&huart1,"USART1 initialization completed!\n", 33);
  

  HAL_UART_Receive_IT(&huart1, RX_buf, 1);
  
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

USART.c添加部分: 

/**
  ******************************************************************************
  * File Name          : USART.c
  ******************************************************************************
  */

/* USER CODE BEGIN 1 */

extern uint8_t RX_buf[10];

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1)
	{
		//printf("uart tx end\n");
	}
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART1)
    {
        printf("Receive : %x\n", RX_buf[0]);
        
        HAL_UART_Receive_IT(&huart1, RX_buf, 1);
    }
}
/* USER CODE END 1 */

实验现象:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F051K8U6按键中断实例 的相关文章

  • Odroid U3 烧写镜像文件

    在Ubuntu下往Odroid U3板子的eMMC卡里烧写xubuntu镜像文件 xff0c 主要步骤如下 xff1a 1 下载要烧写的镜像文件 xff0c 按照需要 xff0c 我下载的是桌面版的xubuntu 13 04 desktop
  • 解决odroid-XU3的HDMI输出问题

    odroid XU3的板子直接通过microHDMI口连接显示器 xff0c 并没有显示 解决方法是修改 media boot boot ini文件 xff0c 取消屏蔽与HDMI设置相关语句 重启之后 xff0c 解决问题 由于不同的显示
  • 现有的 TypeRef 应有对应的 TypeDef(Impl),但它没有

    现有的 TypeRef 应有对应的 TypeDef Impl xff0c 但它没有 本人需要在C 中调用C 43 43 代码 xff0c 故而建立了一个CLR项目 xff0c 建立了四个文件 xff0c 分别是两个纯C 43 43 文件 C
  • [zed2i] 相机内参数获取

    内置对应的程序 xff1a 双目SDK校正方法 关灯避免反射 xff0c 使得房间的灯光尽可能的黑 xff0c 拿着相机对准屏幕的标定板 xff08 可以不关灯 xff09 开始校正 xff0c 红圈是目标 xff0c 需要移动蓝圈 xff
  • Unity 2D独立开发手记(八):基于A*算法的简易寻路

    被生活 43 43 了一个多月 xff0c 都没时间上来吹比了 因为破游戏准备设计敌人了 xff0c 苦于Unity自带的导航系统迟迟不适配2D项目 xff0c 即便用最新的NavMeshSurface把3D当成2D来用 xff0c 也和我
  • 新建keil工程每一个文件夹的作用

    问 xff1a 头文件stm32f10x sdio c的作用 xff1f 有时候在添加路径的时候为什么不添加src xff1f 有些工程里就添加了 新建工程的每一个文件夹的作用 core xff0c obj xff0c STM32 FWLI
  • VScode使用时常见问题

    写在篇首 xff0c vscode各种蜜汁bug xff0c 记录一下解决方案供大家参考 1 无法使用C 43 43 万能头文件 include xff1c bits stdc 43 43 h xff1e 解决方案 在刷题的时候 xff0c
  • Socket网络编程总结

    网络中进程之间如何通信 Java最初是作为网络编程语言出现的 xff0c 其对网络提供了高度的支持 xff0c 使得客户端和服务器的沟通变成了现实 xff0c 而在网络编程中 xff0c 使用最多的就是Socket 像大家熟悉的QQ MSN
  • linux tcp并发式服务器应用SELECT函数编写实例源代码(转载)

    include lt stdio h gt include lt stdlib h gt include lt unistd h gt include lt errno h gt include lt string h gt include
  • Activity启动模式与任务栈(Task)、TaskAffinity应用场景【转】

    转载请注明出处 xff08 谢谢 xff09 xff1a Activity启动模式与任务栈 Task 全面深入记录 xff08 下 xff09 activities waiting to finish 任务栈 zejian 的博客 CSDN
  • VsCode技巧快捷键

    按住Alt 43 鼠标点击可以有多处光标同时编辑 快速显示大纲 相当于eclipse的打开当前类方法列表弹框 gt 设置为Alt 43 D 搜索go to symbol in File 设置即可 vscode设置匹配花括号跳转 Ctrl 4
  • jmeter察看结果树的响应数据时显示乱码

    找到jmeter的安装路径 xff08 即解压路径 xff09 打开apache jmeter 4 0 bin jmeter properties文件 搜索 encoding 关键字 xff0c 找到如下配置 xff1a The encod
  • class 和 struct的区别

    class 和 struct 最本质的区别 class 是引用类型 xff0c 它在堆中分配空间 xff0c 栈中保存的只是引用 xff1b 而 struct 是值类型 xff0c 它在栈中分配空间 什么是class class xff08
  • 第一周——总体了解STM32以及开发环境搭建

    什么是STM32 意法半导体 xff08 ST xff09 集团于1988年6月成立 xff0c 是由意大利的SGS微电子公司和法国Thomson半导体公司合并而成 STM32系列基于专为要求高性能 低成本 低功耗的嵌入式应用专门设计的AR
  • 【ros下激光雷达的简单使用】(1)

    雷达简单使用方法 xff1a 思蓝科技S2的激光雷达 查看硬件是否连接成功 xff1a 使用lsusb wpf 64 wpfpc lsusb Bus 002 Device 001 ID 1d6b 0003 Linux Foundation
  • AMD CPU 电脑突然画面声音突然卡顿,卡碟声,画面撕裂

    有时候会突然卡顿个一两秒 xff0c 然后自己好 xff0c 如果主板买的早 xff0c 没更新过BIOS版本 xff0c 可能是因为AMD的fTPM设置有个BUG xff0c 开启之后有概率会随机卡顿 xff0c 各大厂商最新的主板驱动应
  • STL —— vector,list,deque,使用与优缺点比较

    关于vector list deque 已经做过介绍 xff0c 本文是对三种容器的优劣做出比较 下面是vector list deque的博客链接 vector list deque vector list对比 底层结构 动态顺序表 xf
  • android手机版tcp或者udp通讯测试工具,可以用于工业设备或者系统开发时间测试tcp或是udp连接通讯是否正常工作

    TUtool 介绍 由于工作需要一款安卓的tcp udp测试工具 xff0c 而市场里没有或者不好用 xff0c 或者都是广告 xff0c 现在个人开发者又不让发布应用了 xff0c 小巧好用不收集用户信息的不收费没有广告的小工具只能自己用
  • microhard p900数传配置方法

    配置好的两个 xff08 多个 xff09 数传电台可以通过串口直接相互通讯 xff0c 两个 xff08 多个 xff09 数传之间无线连接 数传电台可以配置多种通讯方式 xff1a 点对点 点对多 mesh组网 xff08 电台数量 2

随机推荐