完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
串口 ***Mian.c*** #include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "usart.h" int main(void) { u16 t; //u8是unsigned char,u16是unsigned short,u32是unsigned long。 //u8,u16,u32都是C语言数据类型,分别代表8位,16位,32位长度的数据类型,一个字节是8位,所以u8是1个字节,u16是2个字节,u32是4个字节。 u16 len; u16 times=0; //定义并初始化times delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 /**** ## - 这里不详细讲解,在下一节外部中断中会解释外部中断优先级 *** //NVIC_PriorityGroup_0 先占优先级(抢占优先级) 0 位 //从优先级(响应优先级) 4 位 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20191107132326235.bmp? x-oss- process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6 Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTgwMDU1MA==,size_16,color_FFFFFF,t_70) //NVIC_PriorityGroup_1 先占优先级 1 位 //从优先级 3 位 //NVIC_PriorityGroup_2 先占优先级 2 位 //从优先级 2 位 //NVIC_PriorityGroup_3 先占优先级 3 位 //从优先级 1 位 //NVIC_PriorityGroup_4 先占优先级 4 位 //从优先级 0 位 */ uart_init(115200); /*//串口初始化为115200 串口初始化函数 使用需要添加#include "usart.h" */ LED_Init(); //LED端口初始化 //LED IO初始化 KEY_Init(); //初始化与按键连接的硬件接口 //按键初始化函数 while(1) { if(USART_RX_STA&0x8000) /* 原子定义了一个16位数:USART_RX_STA为0000 0000 0000 0000,第十六位为0则串口数据没有接收完,为1则接收完了(中断里有判断),而0x8000=1000 0000 0000 0000,所以 USART_RX_STA&0x8000有两种可能: 第一种1××× ×××× ×××× ××××&1000 0000 0000 0000=1000 0000 0000 0000 第二种0××× ×××× ×××× ××××&1000 0000 0000 0000=0000 0000 0000 0000 由此可以判断USART_RX_STA第16位是否为0 */ { len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度 /* USART_RX_STA是一个变量可以是8位的,也可以是16位的。以16位为例它的含义:// bit15,接收完成标志/ / bit14,接收到0x0d // bit13〜0,接收到的有效字节数 和0x3fff与运算就是低14位的运算,因为每接收到一个有效字节会自动加1 */ printf("rn您发送的消息为:rnrn"); for(t=0;t USART_SendData(USART1, USART_RX_BUF[t]); //向串口1发送数据 /* USART_SendData() 功能描述 通过外设 USARTx 发送单个数据 输入参数 1 USARTx:x 可以是 1,2 或者 3,来选择 USART 外设 */ while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束 /***USART_GetFlagStatus:检查指定的 USART 标志位设置与否 输入参数 1 USARTx:x 可以是 1,2 或者 3,来选择 USART 外设 输入参数 2 USART_FLAG:待检查的 USART 标志位 参阅 Section:USART_FLAG 查阅更多该参数允许取值范围 */ } printf("rnrn");//插入换行 USART_RX_STA=0;//设置标志位 }else { times++;//时间计数++ if(times%5000==0) { printf("rn精英STM32开发板 串口实验rn"); printf("正点原子@ALIENTEKrnrn"); } if(times%200==0)printf("请输入数据,以回车键结束n"); if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行. delay_ms(10); //防抖 } } } ***Led.h*** #ifndef __LED_H //先测试LED是否被宏定义过 #define __LED_H //如果LED H没有被宏定义过,定义LED,LED别名为H #include "sys.h" #define LED0 PBout(5)// PB5 #define LED1 PEout(5)// PE5 void LED_Init(void); //初始化 #endif ***Led.c*** #include "led.h" //初始化PB5和PE5为输出口.并使能这两个口的时钟 //LED IO初始化 void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能PB,PE端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5 GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 端口配置, 推挽输出 GPIO_Init(GPIOE, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE.5 输出高 } ***Key.h*** #ifndef __KEY_H #define __KEY_H #include "sys.h" //#define KEY0 PEin(4) //PE4 //#define KEY1 PEin(3) //PE3 //#define WK_UP PAin(0) //PA0 WK_UP #define KEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//读取按键0 #define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)//读取按键1 #define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键3(WK_UP) #define KEY0_PRES 1 //KEY0按下 #define KEY1_PRES 2 //KEY1按下 #define WKUP_PRES 3 //KEY_UP按下(即WK_UP/KEY_UP) void KEY_Init(void);//IO初始化 u8 KEY_Scan(u8); //按键扫描函数 #endif ***Key.c*** #include "stm32f10x.h" #include "key.h" #include "sys.h" #include "delay.h" //按键初始化函数 void KEY_Init(void) //IO初始化 { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE); //使能PORTA,PORTE时钟 /*函数原形 void RCC_APB2PeriphClockCmd(u32 RCC_APB2Periph,FunctionalState NewState) 输入参数 1 RCC_APB2Periph: 门控 APB2 外设时钟 参阅 Section:RCC_APB2Periph 查阅更多该参数允许取值范围 输入参数 2 NewState:指定外设时钟的新状态 这个参数可以取:ENABLE 或者 DISABLE */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_3;//KEY0-KEY1 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入 GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE4,3 //初始化 WK_UP-->GPIOA.0 下拉输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0 } //按键处理函数 //返回按键值 //mode:0,不支持连续按;1,支持连续按; //0,没有任何按键按下 //1,KEY0按下 //2,KEY1按下 //3,KEY3按下 WK_UP //注意此函数有响应优先级,KEY0>KEY1>KEY_UP!! u8 KEY_Scan(u8 mode) { static u8 key_up=1;//按键按松开标志 if(mode)key_up=1; //支持连按 if(key_up&&(KEY0==0||KEY1==0||WK_UP==1)) { delay_ms(10);//去抖动 key_up=0; if(KEY0==0)return KEY0_PRES; else if(KEY1==0)return KEY1_PRES; else if(WK_UP==1)return WKUP_PRES; }else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1; return 0;// 无按键按下 } |
|
|
|
只有小组成员才能发言,加入小组>>
3282 浏览 9 评论
2959 浏览 16 评论
3464 浏览 1 评论
9007 浏览 16 评论
4054 浏览 18 评论
1121浏览 3评论
577浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
572浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2305浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1861浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 10:45 , Processed in 1.116415 second(s), Total 49, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号