请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
风子 提问时间:2015-5-25 18:27 /
本帖最后由 风子 于 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, 下载次数: 1782)

评分

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

查看全部评分

1 收藏 19 评论145 发布时间:2015-5-25 18:27

举报

145个回答
风子 最优答案 回答时间: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
一些经验教程帖子的汇总,欢迎围观

qianfan 回答时间:2015-5-25 19:43:22
不用线连接吧,内部已经连好了。在说,你的那个排阵和芯片压根就没有连在一起。可以好好看看原理图。这个地方很有意思啊。
党国特派员 回答时间:2015-6-5 07:42:32
谢谢分享 null.png null.png null.png null.png null.png null.png null.png null.png null.png null.png
风子 回答时间:2016-7-19 09:19:16
星火007 发表于 2016-7-18 19:08
麻烦看下设置  如下图  看网上解决办法修改多次 但始终找不到原因  flash模式可以下载   不能下载到RAM里 ...

选择下载到SRAM 要重新编译,要在C/C++设置里定义中断向量表位置VECT_TAB_SRAM
有点久远,我忘记了那时候有没有正确设置SRAM调试
Paderboy 回答时间:2015-5-25 18:33:18
多谢,分享。。。
二宽 回答时间:2015-5-25 18:57:49
高手啊   顶楼主, 明天细看下你的虚拟串口
风子 回答时间:2015-5-25 19:09:29
tjhbwjk 发表于 2015-5-25 18:57
高手啊   顶楼主, 明天细看下你的虚拟串口

虚拟串口是STLINK里面做好的,,我还没能力做这个啊
风子 回答时间:2015-5-25 19:56:48
本帖最后由 风子 于 2015-5-25 20:15 编辑
QianFan 发表于 2015-5-25 19:43
不用线连接吧,内部已经连好了。在说,你的那个排阵和芯片压根就没有连在一起。可以好好看看原理图。这个地 ...

哦,看了下,这块板SB确实是连接了的,我以前用的板子没连,没认真看就当成没连了,怪我。排针也是同样的,以前用PB3,PB4,直接换过来也没认真看
风子 回答时间:2015-5-25 19:59:34
本帖最后由 风子 于 2015-5-25 20:02 编辑
QianFan 发表于 2015-5-25 19:43
不用线连接吧,内部已经连好了。在说,你的那个排阵和芯片压根就没有连在一起。可以好好看看原理图。这个地 ...

是PB3,4,USART2的另外一组引脚
firebird213 回答时间:2015-5-26 10:30:22
板上ST-LINK提供了虚拟串口功能,这个确实挺方便的
雄哥哥 回答时间:2015-5-26 10:37:45
谢谢分享
Jackie-404221 回答时间:2015-5-26 10:57:19
多了串口方便不少
逍遥李 回答时间:2015-5-26 11:09:44
你的教程好及时啊
黑皮男 回答时间:2015-5-26 11:27:06
楼主用的哪个版本的库
二宽 回答时间:2015-5-26 11:28:46
大神  SPI_TIModeCmd这个函数是什么意思啊?   看了一上午没看懂,是不是用处不大啊
zhuoyemp4 回答时间:2015-5-26 11:30:32
谢谢分享,学习中
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版