你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 27235|回复: 144

[STM32F3] 【STM32F303开发】基础:工程模板+LED+USART+常用文档+按键中断

  [复制链接]

33

主题

1243

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-3-9
发表于 2015-5-25 18:27:22 | 显示全部楼层 |阅读模式
本帖最后由 风子 于 2017-5-23 09:12 编辑

我来论坛不久,还是很喜欢这里的。遇上这次搞活动,有幸在上周抢到一块,今天终于到手了,很精致的板子,感谢社区!

板子拿到手马上开始建工程测试,本来打算下午就发这个帖子的,因为某些原因拖到现在,写这个帖子也算是对社区一点回馈,都是基础内容,对初学者有一点帮助。不多说,开始:

拿到一块开发板,或者新手接触单片机开发,一般从以下比较简单的事入手:

首先,点亮一个LED灯,也就是操作GPIO,进而可以做个闪烁,跑马灯之类的效果

然后的事就没有顺序了,都是基础,顺序随意:

按键的操作,一般有扫面模式和中断模式

串口通信,USART:发送,接受数据,进而可以用中断模式,深入一步可以做个DMA传输

等等其他内容

1.LED

点亮LED很简单,就是操作GPIO口,就不详细说了,查看原理图,找到对应引脚,配置为推挽输出,然后将其置高或置低就可以点亮或熄灭LED。Nucleo的板子都很简单,F303RE这块只有一个给用户使用的LED,就是LD2,阳极连接的是PA5引脚

附代码:

  1. #define LED_GPIO_PORT                        GPIOA
  2. #define LED_GPIO_CLK                    RCC_AHBPeriph_GPIOA
  3. #define LED2_PIN                         GPIO_Pin_5
  4. /******************************************************************/
  5. #include "LED_Key.h"

  6. void LED_Init(void)
  7. {
  8.         GPIO_InitTypeDef GPIO_InitStruct;
  9.         RCC_AHBPeriphClockCmd(LED_GPIO_CLK, ENABLE);

  10.         GPIO_InitStruct.GPIO_Pin =LED2_PIN;
  11.         GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
  12.         GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
  13.         GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
  14.         GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);
复制代码

2.USART中断模式收发

USART,即同步、异步串行通信,这里只用异步方式。使用中断模式,实现PC串口助手想MCU发送一串数据,MCU将收到的数据发回来。

使用的基本步奏:

1)将开启引脚相应的时钟,将所使用的串口对应的引脚配置为复用功能,Nucleo板子上使用的是USART2,PA2,PA3引脚

2)开启USART时钟,配置USART2的波特率,数据位,停止位等基本数据

3)配置所使用的中断并打开中断

4)打开USART,等待中断

  1. #include "USART.h"
  2. void USART_Config(void)
  3. {
  4.         USART_InitTypeDef USART_InitStructure;
  5.         GPIO_InitTypeDef GPIO_InitStructure;
  6.         NVIC_InitTypeDef NVIC_InitStruct;
  7.         
  8.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

  9.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

  10.         GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_2 | GPIO_Pin_3);   //USART2对应的RX,TX引脚
  11.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;             //复用模式
  12.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;         //推挽输出
  14.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  15.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  16.         //配置复用功能
  17.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_7);
  18.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_7);

  19.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  20.         
  21.         NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn;
  22.         NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
  23.         NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
  24.         NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  25.         
  26.         NVIC_Init(&NVIC_InitStruct);

  27.         USART_InitStructure.USART_BaudRate = 115200;
  28.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  29.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  30.         USART_InitStructure.USART_Parity = USART_Parity_No;
  31.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  32.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  33.         USART_DeInit(USART2);
  34.         USART_Init(USART2, &USART_InitStructure);
  35.         USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//使能中断
  36.         USART_ClearFlag (USART2,USART_FLAG_TC);
  37.         USART_Cmd(USART2, ENABLE);   
  38. }
复制代码

  1. //中断处理函数
  2. void USART2_IRQHandler (void)
  3. {
  4.         if (USART_GetFlagStatus(USART2,USART_FLAG_RXNE) ==SET)
  5.                 {
  6.                         
  7.                         USART_SendData(USART2,USART_ReceiveData(USART2));
  8.                                 
  9.                         while (!USART_GetFlagStatus(USART2,USART_FLAG_TC));
  10.                 }
  11.         USART_ClearITPendingBit(USART2,USART_IT_RXNE);//清中断标志位
  12. }
复制代码

发现中断处理的代码漏了,补上

Nucleo板子虚拟串口的使用:

板子的ST-LINK提供了虚拟串口功能,只要安装好驱动就能直接当串口使用,驱动去官网或者社区找。

QQ图片20150525180640.png

nucleo用户手册(附件)会教你怎么使用,它是用焊接板子上的桥接(SBx)的方法,这里我直接用跳线,这样反而更加方便灵活,可以连接到任何你想连接的引脚。板子使用的USART2,PA2,PA3引脚,连接如图所示:

经网友提醒更正下:这块板子的PA2和PA3引脚其实已经是连接好了的,所以不需要图中的两根线,如果要用其他的引脚(PB3,4)才需要连线

(没错,就是反过来的,在使用跳线的时候也可以用其他引脚如PB3,PB4,甚至其他串口USART1,3,4,5都可以)

更深入的使用DMA方式发送的就不写了,需要的参考:USART_DMA方式发送接收

运行效果图:

QQ截图20150525182306.png

3.本来想把按键处理的程序也一起发了,不过因为某些原因,时间紧迫,调试的时候出了点问题还没解决,这里就不写了,

有需要的可以参考:按键扫描/中断模式

4.工程模板:

自己建的一个可以在SRAM中调试的工程模板,上面的三个例子的程序也都在里面了(按键部分注释掉了),如果懒得自己配置工程的可以拿去用一下,我使用的是MDK5.10,基于标准外设库,不是HAL库。工程自带了外设库,不是使用编译器里面的库,下载直接编译即可运行。

5.常用文档:包括STM32F303RE数据手册+参考手册+库函数书名手册+NucleoF303RE用户手册+原理图

学习开发中遇到的大多数问题都能在这几份文档中找到答案,当然这些在社区和官网都有,不过比较分散,既然我整理好了,顺便发上来一下。

/*------------------------------------------------我是分割线------------------------------------------------------------------*/

6.更新一下按键的程序(6月4日)

前面提到按键中断的程序有点问题,后来忘了这事一直没去解决,今天想起来了,把程序改好了并测试通过

程序运行效果:蓝色按键按下,LED2亮,同时向串口发送“按键按下”,按键松开,LED2灭,同时向串口发送“按键松开”,效果如图:

QQ截图20150604211656.png

代码:

  1. void key_interruptmode(void)
  2. {
  3.         EXTI_InitTypeDef                 EXTI_InitStructure;
  4.         NVIC_InitTypeDef                 NVIC_InitStruct;
  5.         GPIO_InitTypeDef            GPIO_InitStructure;

  6.         RCC_AHBPeriphClockCmd(KEY_GPIO_CLK,ENABLE);
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);

  8.         GPIO_InitStructure.GPIO_Pin = KEY_GPIO_PIN;
  9.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  10.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  11.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        
  12.         GPIO_Init(KEY_GPIO_PORT,&GPIO_InitStructure);

  13.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  14.         NVIC_InitStruct.NVIC_IRQChannel =EXTI15_10_IRQn;
  15.         NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 3;
  16.         NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3;
  17.         NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  18.         NVIC_Init(&NVIC_InitStruct);
  19.         
  20.         SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource13);
  21.         EXTI_ClearITPendingBit(EXTI_Line13);
  22.         
  23.         EXTI_InitStructure.EXTI_Line=EXTI_Line13;
  24.         EXTI_InitStructure.EXTI_LineCmd =ENABLE;
  25.         EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
  26.         EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling;
  27.         EXTI_Init(&EXTI_InitStructure);
  28. }

  29. void EXTI15_10_IRQHandler(void)
  30. {

  31.         if(EXTI_GetITStatus(EXTI_Line13))
  32.                 {
  33.                         if(GPIO_ReadInputDataBit(KEY_GPIO_PORT,KEY_GPIO_PIN)==RESET)                                //按键按下
  34.                                 {
  35.                                         GPIO_SetBits(LED_GPIO_PORT, LED2_PIN);
  36.                                         printf("按键按下...\n");
  37.                                 }
  38.                         else                                        //按键松开
  39.                                 {
  40.                                         GPIO_ResetBits(LED_GPIO_PORT, LED2_PIN);
  41.                                         printf("按键松开...\n");
  42.                                 }
  43.                 }
  44.         EXTI_ClearITPendingBit(EXTI_Line13);
  45. }
复制代码

(此部分单独下载最后一个附件:按键中断程序)

STM32Nucleo_F303RE工程模板.rar (549.34 KB, 下载次数: 1723)

评分

参与人数 1ST金币 +10 收起 理由
斜阳__ + 10 赞一个!

查看全部评分

<
回复

使用道具 举报

33

主题

1243

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-3-9
 楼主| 发表于 2015-5-25 18:39:33 | 显示全部楼层

【STM32F303开发】开发学习笔记、教程集合贴

本帖最后由 风子 于 2015-6-15 16:23 编辑

【STM32F303开发】开发学习笔记、教程集合贴https://www.stmcu.org.cn/module/forum/thread-602010-1-1.html
一些经验教程帖子的汇总,欢迎围观

回复 支持 反对

使用道具 举报

77

主题

1927

回帖

5

蝴蝶豆

论坛元老

最后登录
2020-11-18
发表于 2015-5-25 19:43:22 | 显示全部楼层
不用线连接吧,内部已经连好了。在说,你的那个排阵和芯片压根就没有连在一起。可以好好看看原理图。这个地方很有意思啊。
回复 支持 1 反对 0

使用道具 举报

47

主题

3404

回帖

30

蝴蝶豆

版主

最后登录
2020-12-7
发表于 2015-5-25 18:33:18 | 显示全部楼层
多谢,分享。。。
回复 支持 反对

使用道具 举报

26

主题

178

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-6-11
发表于 2015-5-25 18:57:49 | 显示全部楼层
高手啊   顶楼主, 明天细看下你的虚拟串口
回复 支持 反对

使用道具 举报

33

主题

1243

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-3-9
 楼主| 发表于 2015-5-25 19:09:29 | 显示全部楼层
tjhbwjk 发表于 2015-5-25 18:57
高手啊   顶楼主, 明天细看下你的虚拟串口

虚拟串口是STLINK里面做好的,,我还没能力做这个啊
回复 支持 反对

使用道具 举报

33

主题

1243

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-3-9
 楼主| 发表于 2015-5-25 19:56:48 | 显示全部楼层
本帖最后由 风子 于 2015-5-25 20:15 编辑
QianFan 发表于 2015-5-25 19:43
不用线连接吧,内部已经连好了。在说,你的那个排阵和芯片压根就没有连在一起。可以好好看看原理图。这个地 ...

哦,看了下,这块板SB确实是连接了的,我以前用的板子没连,没认真看就当成没连了,怪我。排针也是同样的,以前用PB3,PB4,直接换过来也没认真看
回复 支持 反对

使用道具 举报

33

主题

1243

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-3-9
 楼主| 发表于 2015-5-25 19:59:34 | 显示全部楼层
本帖最后由 风子 于 2015-5-25 20:02 编辑
QianFan 发表于 2015-5-25 19:43
不用线连接吧,内部已经连好了。在说,你的那个排阵和芯片压根就没有连在一起。可以好好看看原理图。这个地 ...

是PB3,4,USART2的另外一组引脚
回复 支持 反对

使用道具 举报

1

主题

40

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-7-16
发表于 2015-5-26 10:30:22 | 显示全部楼层
板上ST-LINK提供了虚拟串口功能,这个确实挺方便的
回复 支持 反对

使用道具 举报

3

主题

9

回帖

0

蝴蝶豆

新手上路

最后登录
2015-6-16
发表于 2015-5-26 10:37:45 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版