历史上的今天
返回首页

历史上的今天

今天是:2025年01月14日(星期二)

正在发生

2019年01月14日 | STM32F407ZET6 用串口通过键盘控制LED灯的亮灭

2019-01-14 来源:eefocus

1、串口定义

    串口通信是一种设备间非常常用串行通信(数据交互)方式,因为它比较简单便捷,大部分电子设备支持串口通信方式,电子工工程师调试设备时常用的接口


串行通信:占用I/O较少,速度上较慢点

并行通信:占用I/O较多,速度上快速


2、常见通信方式

1) 单工

单工通信数据只能往一个方向发向(收音机)


2) 半双工

同一时间内只能传输或者发送数据(呼叫机)


3) 全双工(串口)

   同一时间内数据可以发送及接收(电话机)


3、使用串口通信配置库函数流程


1) 串口时钟使能,GPIO 时钟使能。


2) 设置引脚复用器映射:调用 GPIO_PinAFConfig 函数。


3) GPIO 初始化设置:要设置模式为复用功能。


4) 串口参数初始化:设置波特率,字长,奇偶校验等参数。


5) 开启中断并且初始化 NVIC,使能中断(如果需要开启串口中断才需要这个步骤)。


6) 使能串口。


7) 编写中断处理函数:函数名格式为 USARTx_IRQHandler(x 对应串口号)。


4、具体部分代码和详细注解


相关说明:1) 这里用到的串口是:PA9(USART1 TX)和PA10(USART RX)

            控制的led灯是:PE13、PE14、PF9、PF10,其中,低电平时,灯亮。

            用到的按键是 PA0,并且按下的时候为低电平


        2) 在相关函数中用到了  PFout(9) = 1;  PFout(10) = 1; PAin(0) == 0; 

            这些类型的语句,这是进行过相关的宏定义的,所以,如果没有定义,就不能随便用这些语句,以免出错。

            可以用 GPIO_SetBits(GPIOF, GPIO_Pin_9);

                  GPIO_SetBits(GPIOF, GPIO_Pin_10);

                  GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);  代替上面三句


void usart_init()   //usart 初始化配置相关内容

{

    //首先定义几个需要用到的结构体

    GPIO_InitTypeDef  GPIO_InitStructure;

    USART_InitTypeDef  USART_InitStruct;

    NVIC_InitTypeDef NVIC_InitStruct;

    //时钟的初始化

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);


    //GPIO口初始化

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;    //UART1 TX RX

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;       //复用功能

    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

    GPIO_Init(GPIOA, &GPIO_InitStructure);


    //设置引脚复用映射

    GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); 

    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);


    //进行UART的相关配置

    USART_InitStruct.USART_BaudRate = 9600;    //波特率

    USART_InitStruct.USART_WordLength = USART_WordLength_8b;  //数据位

    USART_InitStruct.USART_StopBits = USART_StopBits_1;       //停止位

    USART_InitStruct.USART_Parity = USART_Parity_No;          //奇偶校验位

    USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //模式

    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件控制流

    USART_Init(USART1,&USART_InitStruct);


    //使能中断

    USART_ITConfig(USART1,USART_IT_RXNE, ENABLE);


    //配置UART相关中断

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   //抢占式和响应式的优先级分组设置

    NVIC_InitStruct.NVIC_IRQChannel =  USART1_IRQn;         

    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;  //抢占式优先级

    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3;         //响应式优先级

    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStruct);


    //使能USART1

    USART_Cmd(USART1,ENABLE);   

}


//USART1 中断函数

void USART1_IRQHandler()

{

    u16 Res;

    if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)  //判断是否接收到数据

    {

            USART_ClearITPendingBit(USART1,USART_IT_RXNE);  //清除中断标志位,防止重复进入中断

            Res =USART_ReceiveData(USART1);                 //将接受的数据传给Res

            switch(Res)

            {

                case   1 : PFout(9) = 1;

                            PFout(10) = 1;

                            PEout(13) = 1;

                            PEout(14) = 1;  break;

                case   2 : PFout(9) = 0;

                            PFout(10) = 0;

                            PEout(13) = 0;

                            PEout(14) = 0;  break;

                default : break;

            }

    }

    USART_SendData(USART1, Res);  //每次将接收到的数据再发送回去

}


int main()

{

    int i;

    char a[15]="hello world\r\n";

    LED_Init();

    usart_init();

    while(1)

    {

        //这里是主函数检测一个按键有无按下,若有按下,则发送一串字符过去

        if(PAin(0) == 0)

        {

            delay(2);   //消抖

            if(PAin(0) == 0)

            {     

                for(i=0;i<20;i++)

                {

                    //每次发送一个字节

                    USART_SendData(USART1, a[i]);  

                    //每次等待一个数据发送完成,再发下一个

                    while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET); 

                }   

            }

        }

    }

}


5、结果和现象显示


1) 每当按下一次 PA0 按键,串口助手就会接收到发送过来的数据 "hello world" 如下图所示


1


2) 在串口助手的发送区发送 2 时,四个LED亮了 如下图所示


2

并且与此同时,2 也在串口助手中显示出来了

3

3) 在串口助手的发送区发送 1 时,四个LED灭了,如下图所示

4

并且与此同时,1 也在串口助手中显示出来了

5


至此,串口测试完毕。 希望对你有所帮助!

推荐阅读

史海拾趣

AAC [American Accurate Components]公司的发展小趣事

进入21世纪,AAC公司继续加大市场拓展力度。2003年,AAC成功拓展了台湾市场,与明基、仁宝电脑和华宇电脑等知名企业建立了合作关系。为了满足这些客户对高品质耳机的需求,AAC开始生产制造耳机产品。这一创新举措不仅丰富了AAC的产品线,也进一步提升了其在电子消费产品市场的竞争力。

HBControls公司的发展小趣事
定期检查冰箱电源线、插头、插座等是否完好无损,避免老化、破损引起的电路故障。
Belden Wire & Cable公司的发展小趣事

随着市场的不断变化和客户需求的多样化,Belden公司开始实施产品多元化战略。除了传统的电线电缆产品外,公司还开发了一系列新型电缆产品,如光纤电缆、数据电缆等。这些新产品不仅拓宽了公司的产品线,还为公司带来了新的增长点。同时,Belden还加大了市场拓展力度,积极参与各类行业展会和论坛,提升品牌影响力。

Devar Inc公司的发展小趣事

可穿戴设备市场近年来持续增长,Devar Inc公司也积极布局这一领域。公司研发了一系列具有创新性的可穿戴设备,如智能手环、智能眼镜等。这些设备不仅具备健康监测、运动记录等基本功能,还集成了Devar的AI技术,能够为用户提供更加个性化的服务。例如,智能手环可以根据用户的运动习惯和健康数据,为用户提供定制化的运动计划和健康建议。

Conexcon Group公司的发展小趣事

在电子行业的发展过程中,环保问题日益受到关注。Conexcon Group积极响应国家环保政策,将绿色环保理念贯穿于产品研发、生产和销售的全过程。公司采用了环保材料和工艺,减少了对环境的污染和破坏。同时,公司还加强了废旧电子产品的回收和处理工作,推动了电子行业的可持续发展。这些举措不仅赢得了消费者的认可和支持,也为公司树立了良好的社会形象。

FTCAP Fischer & Tausche Capacitor Group公司的发展小趣事

在电子行业的快速发展中,Conexcon Group以其前瞻性的技术视野,成功研发出一款新型智能芯片,这款芯片不仅性能卓越,而且功耗极低,迅速赢得了市场的青睐。公司凭借这一技术突破,逐步扩大了在国内外市场的份额,成为了行业内技术创新的领军者。随着产品线的不断丰富,Conexcon Group逐渐形成了从芯片设计到整机制造的完整产业链,进一步巩固了其在电子行业的领先地位。

问答坊 | AI 解惑

uCOS-ii for S3c44b0x

我这有很多关于uCOS-II藏品陆续上传,谁有Nucleus,请传一下.…

查看全部问答>

ARM指令SMULBB是什么意思啊,,

ARM指令SMULBB和SMULWB是什么意思啊? 哪位打给给你详细点说明啊,,上网没找到,,,…

查看全部问答>

VC EVC 的区别

VC和EVC的区别是什么…

查看全部问答>

学习微型计算机系统原理机应用遇到困难

书中提到的8237A 8259A 8253-PIT 8255A 8250 8251A这些片子总觉得不是很熟,不会编程,大家有什么好的建议,能让我掌握他们。有什么好的资料吗?…

查看全部问答>

应用程序如何查询中断

驱动使用DDK写的,不是DS+DDK,以前用DS+DDK的时候是应用把一个Event的HANDLE传进去,然后驱动里面用传进来的HANDLE生成一个KEVENT,应用那里启动一个线程,线程里面等待那个Event就行了,这样当发生中断时驱动的DPC就把KEVENT设置,应用的那个线程就 ...…

查看全部问答>

STM32处理器如何实现关所有中断功能

                                 我一直没发现STM32有关所有中断的功能,想问一下大家是不是它不能实现。或者有什么办法来实现这个功能。一个个的关 ...…

查看全部问答>

ALTERA亚洲创新大赛

本帖最后由 paulhyde 于 2014-9-15 03:31 编辑 请教各位,关于ALTERA亚洲创新大赛的选题应该从哪方面入手思考?  …

查看全部问答>

跪求SDHC卡初始化时ACMD41的argument

在做430向SD卡写数据时候,SD卡可以,但是用SDHC卡初始化过程中CMD0的响应正确,ACMD41响应总是0x01,是不是argument有问题呢?…

查看全部问答>

山东省电子设计大赛来了

2012TI杯山东省大学生电子设计竞赛                基本仪器和主要元器件清单 1、基本仪器清单 数字电桥 直流稳压电源 量角器 米尺  四位半数字万用表  0~200℃温度 ...…

查看全部问答>

请问在main中进入LPM4,在外部中断唤醒后在中断进入LPM3,这时程序是回到main中了...

首先在main吧,我运行了“_BIS_SR(LPM4_bits + GIE);         // Enter LPM4” 先外部IO口中断函数中我又运行了“_BIS_SR(LPM3_bits + GIE);”,请问在此之后,程序是继续执行完中断函数后面的内容再进入LPM3,还是 ...…

查看全部问答>