【嵌入式】——串口实验——实现芯片串口收发数据,按键中断串口发送数据,串口接收数据中断来控制LED亮/灭
实验目的:
实现芯片串口收发数据,按键中断串口发送数据:按下按键,向串口发送数据,并通过虚拟终端显示出来;
串口接收数据中断来控制LED亮/灭:通过串口助手向MCU发送数据,“A”把LED灯点亮,“B”把LED灯熄灭。
led_key.c
#include "stm32f4xx.h"
#include "bitband.h"
void led_init()//PD0、PD1、PD2、PD3
{GPIO_InitTypeDef d;/*使能GPIOD的时钟*/RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);/*配置PD0-PD6,为输出模,输出推挽类型,低速模式*/d.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3| GPIO_Pin_4| GPIO_Pin_5| GPIO_Pin_6;d.GPIO_Mode = GPIO_Mode_OUT;d.GPIO_OType = GPIO_OType_PP;d.GPIO_Speed = GPIO_Low_Speed;GPIO_Init(GPIOD, &d);
}void key_init()
{ /*按键初始化*/GPIO_InitTypeDef b;/*使能GPIOB的时钟*/RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);/*配置PB2,PB6为输入模式,上拉,按下去就会变成低电平*/b.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_6;b.GPIO_Mode = GPIO_Mode_IN;b.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOB, &b);}void led_control(int led_num,int status)
{switch(led_num){case 0:PDout(0) = status;break;case 1:PDout(1) = status;break;case 2:PDout(2) = status;break;case 3:PDout(3) = status;break; case 4:PDout(4) = status;break; case 5:PDout(5) = status;break; case 6:PDout(6) = status;break;
}}/*all_led_control,根据state的每一位来控制所有的LED灯*/void all_led_control(unsigned char state){PDout(0)=!!(state&(1<<0)); //!!把真变成1,把假变成0;PDout(1)=!!(state&(1<<1)); PDout(2)=!!(state&(1<<2)); PDout(3)=!!(state&(1<<3)); PDout(4)=!!(state&(1<<4)); PDout(5)=!!(state&(1<<5)); PDout(6)=!!(state&(1<<6)); }int key_status(int key_num)
{switch(key_num){case 0:return PBin(2);case 1:return PBin(6);}return -1;
}void motor_init(void)//PA4
{GPIO_InitTypeDef a;/*使能GPIOA的时钟*/RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);/*配置PA4为输出模,输出推挽类型,低速模式*/a.GPIO_Pin = GPIO_Pin_4 ;a.GPIO_Mode = GPIO_Mode_OUT;a.GPIO_OType = GPIO_OType_PP;a.GPIO_Speed = GPIO_Low_Speed;GPIO_Init(GPIOA, &a);PAout(4) = 0;
}void motor_control(int status)
{PAout(4) = status;
}void beep_init(void)//PB12
{GPIO_InitTypeDef b;/*使能GPIOB的时钟*/RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);/*配置PB12为输出模,输出推挽类型,低速模式*/b.GPIO_Pin = GPIO_Pin_12 ;b.GPIO_Mode = GPIO_Mode_OUT;b.GPIO_OType = GPIO_OType_PP;b.GPIO_Speed = GPIO_Low_Speed;GPIO_Init(GPIOB, &b);PBout(12) = 0;
}void beep_control(int status)
{PBout(12) = status;
}
uart.c
#include "uart.h"
#include "led_key.h"
void usart1_init(uint32_t BaudRate) //PA9,PA10
{/*GPIO口配置*/GPIO_InitTypeDef GPIO_InitStruct;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能时钟GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF; //复用模式GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;GPIO_InitStruct.GPIO_Speed=GPIO_High_Speed; //速率GPIO_Init(GPIOA,&GPIO_InitStruct);//GPIO初始化;GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//指定复用功能GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);//指定复用功能/*USART配置*/USART_InitTypeDef USART_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能串口时钟USART_InitStruct.USART_BaudRate=BaudRate;//设置波特率USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无流控USART_InitStruct.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//发送接收模式USART_InitStruct.USART_Parity=USART_Parity_No; //无校验USART_InitStruct.USART_StopBits=USART_StopBits_1; //1个停止位USART_InitStruct.USART_WordLength=USART_WordLength_8b; //8位数据长度USART_Init(USART1,&USART_InitStruct);/*中断配置*/NVIC_InitTypeDef NVIC_InitStruct;USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //来数据触发中断使能;NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn; //中断通道配置NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0x02;NVIC_InitStruct.NVIC_IRQChannelSubPriority=0x02;NVIC_Init(&NVIC_InitStruct);/*使能串口*/USART_Cmd(USART1,ENABLE);}/*USART1的中断处理函数*/
void USART1_IRQHandler(void)
{unsigned char data;if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET){data=USART_ReceiveData(USART1);if(data=='A'){led_control(0,1); led_control(1,1); led_control(2,1); led_control(3,1); }else if(data=='B'){led_control(0,0); led_control(1,0); led_control(2,0); led_control(3,0); }USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清空标志位}}/* 串口数据的发送*/
void USART_SendDatas(USART_TypeDef * USARTx,unsigned char *dataBuf,int len)
{ int i;for(i=0;i<len;i++){ USART_SendData(USARTx,dataBuf[i]);//等待发送完成while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE)==RESET);}
}
main.c
#include "main.h"
#include "led_key.h"
#include "delay.h"
//#include "timer.h"
#include "uart.h"unsigned char str1[] = { "Hello, how are you?\n" };
unsigned char str2[] = { "Fine, thank you, and you?\n" };int main(){ led_init();key_init();usart1_init(9600);while(1){if (key_status(0) == 0){USART_SendDatas(USART1, str1, sizeof(str1));delay_ms(200);}if (key_status(1) == 0){USART_SendDatas(USART1, str2, sizeof(str2));delay_ms(200);}}}
实验框图:
实验现象:
视频演示链接:https://www.bilibili.com/video/BV1Pi4y1x7q1
部分截图
在串口调试助手中发送B,灯全部熄灭
记录一个实验中遇到的问题:
唯一一个问题就是VSPD和串口调试助手的使用。成功仿真了一次后,想要再仿真第二次,但是提示说“串口不存在或串口被占用”,于是我到注册列表中将串口全部关闭,此时VSPD已经显示串口处于关闭状态,但是打开串口调试助手还是出现提醒“串口不存在或串口被占用”。于是我想在VSPD中把这两个串口删除重新创建,但是删不掉,提示说“串口已经打开,无法删除”,但VSPD中显示串口是关闭状态并且注册列表中也将串口删除,于是我到设备管理器中卸载虚拟串口,再次尝试,还是失败。上网查了一下,发现不少人和我有一样的问题,只要把VPSD卸载重新安装并且将电脑重新启动就好了。
【嵌入式】——串口实验——实现芯片串口收发数据,按键中断串口发送数据,串口接收数据中断来控制LED亮/灭相关推荐
- 十、stm32-ESP8266(串口透传、MCU透传、控制LED亮灭)
目录 一.固件库模板 二.准备资料 三.简介 1. 引脚 2. 无线组网 2.1 ESP8266 在 SoftAP 模式 2.2 ESP8266 在 station 模式 2.3 ESP8266 在 ...
- STM32-通过串口收发控制LED亮灭(使用USART1 查询法)
实现的功能 1.电脑发送'ON' 如果已是亮灯状态则返回'the LED has been ON' 如果为熄灭状态则点亮LED并返回'the LED is ON now' 2.电脑发送'OFF' 如果 ...
- CC2530基础实验:(2)外部中断控制LED亮灭
目录 前言 一.实验相关电路图 二.实验相关理论与寄存器 1.中断相关的基础概念 2.CC2530 的中断系统 3.CC2530 的中断处理函数编写方法 4.CC2530 的外部中断 三.源码分析 前 ...
- STM32利用中断实现LED亮灭和串口通信的收发
HAL库的中断函数学习 一.题目要求 二.实现LED亮灭 01 CubeMx配置 02 Keil配置 03 实例演示 三.串口中断通信 01 CubeMx配置 02 Keil配置 03 实例演示 四. ...
- 基于BC95的数据转发,利用Python实现UDP接收数据,TCP转发数据
基于BC95的数据转发,利用Python实现UDP接收数据,TCP转发数据 文章信息 环境信息 系统概览 基于Python的UDP(服务端)数据接收 1. UDP接受的数据如何读取 文章信息 撰写日期 ...
- STM32c8t6串口+蓝牙控制PC13亮灭
Hello,大家好,这是我第一次来CSDN上写,想像CSDN里的前辈一样,对自己的知识做一种记录和总结,并且也希望里面内容有能帮助到大家的. 目录 一.模块介绍 二.程序调试 1. USART1 2. ...
- 蓝桥杯嵌入式板-解决LCD使LED亮灭混乱的办法
比赛板用的是stm32f103RB芯片,64管脚,LED与LCD同用了管脚PC8~PC15(对应LED1~LED8),所以板子上增用了一个锁存器--M74HC573.在控制LED的时候,只需在输出对应 ...
- 微信小程序获取Onenet温湿度数据并控制灯亮灭
其实之前就写过类似的文章,但是看过我博客的朋友就知道,我是先写微信小程序获取onenet,然后再写esp32上云到onenet.一篇是ESP32-C3通过MQTT协议把温湿度上传到OneNet平台 ...
- 1、HAL库UART 中断|DMA 自动回显接收数据
1.实现代码: stm32f4xx_hal_conf.h文件开启UART宏定义 #define HAL_UART_MODULE_ENABLED 添加stm32f4xx_hal_uart.c和stm32 ...
最新文章
- 智能工厂的关键:基于机器学习的工业视觉
- do_page_fault: epc == 00000000, ra == 00000000
- 学科网站建设的尝试与思考
- 获取iOS设备的型号
- DMA双缓冲传输意义
- sf | 空间矢量对象的属性连接方法
- iif能用到mysql中吗_数据库 iif
- 使用git遇到的问题汇总
- 融云android系统消息,如何解决 嵌入融云SDK后, Android 手机收不到消息推送?
- Axure share如何自适应手机屏幕
- C++ Primer 5th 源代码使用说明
- Php处理输入法表情,php开发中手机输入法自带的表情、emoji表情、微信表情不显示问题,以及过虑emoji表情方法!...
- 抖音数据统计_抖音账号数据分析
- 5G接入网与基站演进
- 修改人人商城支付后报错“服务器暂时无法处理您的请求,请稍后重试“
- java graphics2d旋转_JAVA用Graphics2D实现图片旋转,缩放,合成
- Ubuntu的共享文件夹
- pytorch distiller Weights Pruning Algorithms
- 微信备份到云服务器失败是怎么回事,电脑微信备份连接失败的原因(解决利用电脑版微信备份的方法)...
- 15页PPT:摘果式拣选与播种式拣选
热门文章
- 苹果隐藏app_更新完iOS14,这9个隐藏黑科技功能,你一定还不知道
- flask学习笔记一:app.run
- python中一个等于号和两个等于号_Python中is与双等于号“==”的区别
- 音符起始点检测(音频节奏检测)(1)
- 10没有基于策略的qos_电力通信 | 基于智能光网络系统的配用电业务承载方案研究...
- ipad键盘使用快捷键_每个iPad使用者都应该知道的20个键盘快捷键
- tcp/ip网络编程--accept()函数返回的套接字
- HMM、MEMM、CRF
- C语言--逗号运算符及逗号表达式
- 爬虫2_起点中文网字体反爬