完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一、中断简介
1.中断概念 整个中断过程分为三步 1.中断发生:当CPU在处理某一事件A时, 发生了另一事件B,请求CPU迅速去处理 2.中断处理:CPU暂停当前的工作,转去处理事件B 3.中断返回:当CPU将事件B处理完毕后,再回到事件A中被暂停的地方继续处理事件A 中断程序执行过程示意图: 中断响应过程: 2.中断的作用 中断有4个方面的作用 1.速度匹配:可以解决快速的CPU与慢速的外部设备之间传送数据的矛盾 2.分时操作:CPU可以分时为多个外部设备服务,提高计算机的利用率 3.实时响应:CPU能够及时处理应用系统的随机事件, 增强系统的实时性 4.可靠性高:CPU可以处理设备故障及掉电等突发事件,提高系统可靠性 3.中断优先级 1.多个中断同时出现时,处理器先响应高优先级的中断 2.低优先级中断的ISR执行时,可以被高优先级中断再次打断 3.ISR比App Code拥有更高的执行优先级 二、实验题目要求 1. 题目一 用stm32F103核心板的GPIOA端一管脚接一个LED,GPIOB端口一引脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯。 2. 题目二 采用串口中断方式重做上周的串口通信作业。 三、中断方式点灯 1.CubeMX工程设置 1 在主界面选择File–>New Project 或者直接点击ACCEE TO MCU SELECTOR 2 进行芯片型号选择,一般直接在左上角搜索自己的芯片型号即可。 3外设管脚设置 设置指示灯LED引脚PB5,设置引脚模式为输出模式GPIO_Output 设置按键引脚PA1,设置引脚为外部中断功能,PA1与外部中断线EXIT1连接GPIO_EXIT1 对于开关对应管脚PA1,设置其触发方式为上升沿触发 使能对应的外部中断线,点击Enabled 4时钟设置 5生成工程文件 2.代码部分 1.首先打开cubemx生成的工程文件 2.在Keil文件中的gpio.c文件可以找到中断服务函数 void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) 当捕获到上升沿,触发中断,就会进入到这个函数里面 然后就会执行HAL_GPIO_EXTI_Callback(GPIO_Pin)函数,此函数为回调函数,我们打开可以发现前面有个weak。 前面的 __weak 表示此函数为虚函数,需要用户重写的。 在main文件下找一个位置添加以下代码 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if( GPIO_Pin == A1_EXTI_Pin)//判断外部中断源 { HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);//翻转LED状态 }} 3.编译 4.烧录 5.结果展示 四、中断方式实现串口通信 1.上周题目要求 完成一个STM32的USART串口通讯程序(查询方式即可,暂不要求采用中断方式),要求: 1)设置波特率为115200,1位停止位,无校验位; 2)STM32系统给上位机(win10)连续发送“hello windows!”。win10采用“串口助手”工具接收。 2.工程建立 选择芯片并设置RCC、SYS, 设置串口 1)点击USART1 2)设置MODE为异步通信 3)基础参数:波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1 NVIC Settings 一栏使能接收中断 时钟设置 创建工程 3.代码编写 在main.c和usart.c中添加头文件#include “stdio.h” 之后,在usart.c文件中,添加如下代码,进行重定义 /* USER CODE BEGIN 1 */ //加入以下代码,支持printf函数,而不需要选择use MicroLIB //#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #if 1 //#pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __FILE { int handle; }; FILE __stdout; //定义_sys_exit()以避免使用半主机模式 void _sys_exit(int x) { x = x; } //重定义fputc函数 int fputc(int ch, FILE *f) { HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0x0001); return ch; } #endif /* USER CODE END 1 */ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 在main.c主函数中,添加发送数据 /* USER CODE END WHILE */ printf("Hello windows!rn"); HAL_Delay(500); /* USER CODE BEGIN 3 */ 1 2 3 4 5 在main.c中添加如下定义,用来接收串口数据 uint8_t aRxBuffer; //接收中断缓冲 uint8_t Uart1_RxBuff[256]; //接收缓冲 uint8_t Uart1_Rx_Cnt = 0; //接收缓冲计数 uint8_t cAlmStr[] = "数据溢出(大于256)rn"; 1 2 3 4 添加开启接收中断的语句 /* USER CODE BEGIN 2 */ HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); /* USER CODE END 2 */ 1 2 3 在main.c下部添加中断回调函数 /* USER CODE BEGIN 4 */ /** * @brief Rx Transfer completed callbacks. * @param huart pointer to a UART_HandleTypeDef structure that contains * the configuration information for the specified UART module. * @retval None */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { /* Prevent unused argument(s) compilation warning */ UNUSED(huart); /* NOTE: This function Should not be modified, when the callback is needed, the HAL_UART_TxCpltCallback could be implemented in the user file */ 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); //再开启接收中断 } /* USER CODE END 4 */ 4.编译烧录 编译结果 烧录结果 5.结果展示 串口每隔0.5s输出Hello windows 当下方发送数据,例如123456789,串口会进入中断,之后回到原循环,继续发送Hello windows。 |
|
|
|
只有小组成员才能发言,加入小组>>
3277 浏览 9 评论
2950 浏览 16 评论
3454 浏览 1 评论
8983 浏览 16 评论
4044 浏览 18 评论
1092浏览 3评论
566浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
561浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2297浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1854浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 16:48 , Processed in 0.941136 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号