实验目的:
实现芯片串口收发数据,按键中断串口发送数据:按下按键,向串口发送数据,并通过虚拟终端显示出来;
串口接收数据中断来控制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亮/灭相关推荐

  1. 十、stm32-ESP8266(串口透传、MCU透传、控制LED亮灭)

    目录 一.固件库模板 二.准备资料 三.简介 1. 引脚 2. 无线组网 2.1 ESP8266 在 SoftAP 模式 2.2 ESP8266 在 station 模式 2.3 ESP8266 在 ...

  2. STM32-通过串口收发控制LED亮灭(使用USART1 查询法)

    实现的功能 1.电脑发送'ON' 如果已是亮灯状态则返回'the LED has been ON' 如果为熄灭状态则点亮LED并返回'the LED is ON now' 2.电脑发送'OFF' 如果 ...

  3. CC2530基础实验:(2)外部中断控制LED亮灭

    目录 前言 一.实验相关电路图 二.实验相关理论与寄存器 1.中断相关的基础概念 2.CC2530 的中断系统 3.CC2530 的中断处理函数编写方法 4.CC2530 的外部中断 三.源码分析 前 ...

  4. STM32利用中断实现LED亮灭和串口通信的收发

    HAL库的中断函数学习 一.题目要求 二.实现LED亮灭 01 CubeMx配置 02 Keil配置 03 实例演示 三.串口中断通信 01 CubeMx配置 02 Keil配置 03 实例演示 四. ...

  5. 基于BC95的数据转发,利用Python实现UDP接收数据,TCP转发数据

    基于BC95的数据转发,利用Python实现UDP接收数据,TCP转发数据 文章信息 环境信息 系统概览 基于Python的UDP(服务端)数据接收 1. UDP接受的数据如何读取 文章信息 撰写日期 ...

  6. STM32c8t6串口+蓝牙控制PC13亮灭

    Hello,大家好,这是我第一次来CSDN上写,想像CSDN里的前辈一样,对自己的知识做一种记录和总结,并且也希望里面内容有能帮助到大家的. 目录 一.模块介绍 二.程序调试 1. USART1 2. ...

  7. 蓝桥杯嵌入式板-解决LCD使LED亮灭混乱的办法

    比赛板用的是stm32f103RB芯片,64管脚,LED与LCD同用了管脚PC8~PC15(对应LED1~LED8),所以板子上增用了一个锁存器--M74HC573.在控制LED的时候,只需在输出对应 ...

  8. 微信小程序获取Onenet温湿度数据并控制灯亮灭

    ​ 其实之前就写过类似的文章,但是看过我博客的朋友就知道,我是先写微信小程序获取onenet,然后再写esp32上云到onenet.一篇是ESP32-C3通过MQTT协议把温湿度上传到OneNet平台 ...

  9. 1、HAL库UART 中断|DMA 自动回显接收数据

    1.实现代码: stm32f4xx_hal_conf.h文件开启UART宏定义 #define HAL_UART_MODULE_ENABLED 添加stm32f4xx_hal_uart.c和stm32 ...

最新文章

  1. 智能工厂的关键:基于机器学习的工业视觉
  2. do_page_fault: epc == 00000000, ra == 00000000
  3. 学科网站建设的尝试与思考
  4. 获取iOS设备的型号
  5. DMA双缓冲传输意义
  6. sf | 空间矢量对象的属性连接方法
  7. iif能用到mysql中吗_数据库 iif
  8. 使用git遇到的问题汇总
  9. 融云android系统消息,如何解决 嵌入融云SDK后, Android 手机收不到消息推送?
  10. Axure share如何自适应手机屏幕
  11. C++ Primer 5th 源代码使用说明
  12. Php处理输入法表情,php开发中手机输入法自带的表情、emoji表情、微信表情不显示问题,以及过虑emoji表情方法!...
  13. 抖音数据统计_抖音账号数据分析
  14. 5G接入网与基站演进
  15. 修改人人商城支付后报错“服务器暂时无法处理您的请求,请稍后重试“
  16. java graphics2d旋转_JAVA用Graphics2D实现图片旋转,缩放,合成
  17. Ubuntu的共享文件夹
  18. pytorch distiller Weights Pruning Algorithms
  19. 微信备份到云服务器失败是怎么回事,电脑微信备份连接失败的原因(解决利用电脑版微信备份的方法)...
  20. 15页PPT:摘果式拣选与播种式拣选

热门文章

  1. 苹果隐藏app_更新完iOS14,这9个隐藏黑科技功能,你一定还不知道
  2. flask学习笔记一:app.run
  3. python中一个等于号和两个等于号_Python中is与双等于号“==”的区别
  4. 音符起始点检测(音频节奏检测)(1)
  5. 10没有基于策略的qos_电力通信 | 基于智能光网络系统的配用电业务承载方案研究...
  6. ipad键盘使用快捷键_每个iPad使用者都应该知道的20个键盘快捷键
  7. tcp/ip网络编程--accept()函数返回的套接字
  8. HMM、MEMM、CRF
  9. C语言--逗号运算符及逗号表达式
  10. 爬虫2_起点中文网字体反爬