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

(续)STM32F042评测之:玩玩串口+GPIO

[复制链接]
Inc_brza 发布时间:2016-3-9 18:01
    添加味道,上午对STM32F042做了比较简单的介绍,现在我们来让nucleo32跑起来!
    为了省时,我使用了CubeMx作为架构生成平台:
STEP 1:
        打开CubeMx软件,并且选择Board Selector,Verdor选择默认,Type of board 选择Nucleo32,Mcu Series选择STM32F0,然后确定完成
芯片,板型号选择步骤。
setp1.png

STEP 2:
进行引脚,外设配置,在这里,芯片默认会使用内部RC8M作为系统时钟,哥不喜欢,哥喜欢快,所以点击Clock Configuration:显示时钟配置界面,
然后选用HSI RC 48Mhz作为系统时钟,详细配置如图所示:
step2_2.png
然后,我们继续进行芯片外设引脚配置,第一,使用uart2(nuceleo32 F042使用usart2连接stlink 的vcp)所以我们不需要另外的转串口工具。
配置如图所示:
step2_3.png
我们采用异步串口,所以选用Asynchronous,这里我们还没有完毕,我们还需要配置uart的参数,我们采用115200,8-n-1配置
1、点击configuration:
2、双击connectivity中的USART2
3、Baud Rate选项输入115200
4、Word Length 选择8bit,其他保持默认
5、点击Apply,OK
6、此时我们已经完成了串口的发送,接收功能配置

QQ截图20160309173353.png
接下来,我们配置LED,板载LED连接PB3
所以我直接配置PB3为output,其实我们可以看出,芯片默认已经有串口的引脚配置了,我们只需要使能Usart2即可,如果没有
我们也可以设置PA2为USART2_TX,PA15为USART2_RX
配置好后,如下图所示
setp2_4.png
SETP 3:
这样,板子硬件我们已经配置好了,接下来就是生成工程,点击toolbar上的齿轮符号(Generate source code based on user settings),
会弹出Project settings窗口,分别输入project name(项目名) project location(项目路径) IDE(项目工作平台),
然后切换到Code Generator界面并且按照如下如所示设置即可:
step3.png setp3_1.png
最后我们按确定,open project,项目环境就建立好了

STEP 4:
编辑User Code:
编辑LED的翻转函数
  1. #define LED_PORT            GPIOB
  2. #define LED_PIN             GPIO_PIN_3
  3. #define LED_GREEN_TOGGLE    HAL_GPIO_TogglePin(LED_PORT,LED_PIN)
复制代码
编辑main函数:
  1. /* USER CODE BEGIN WHILE */
  2.   while (1)
  3.   {
  4.     uint32_t wSysClock;
  5.     /* USER CODE END WHILE */

  6.     /* USER CODE BEGIN 3 */
  7.     wSysClock = HAL_RCC_GetSysClockFreq();
  8.     printf("System Clock is :%ld\r\n",wSysClock);
  9.     HAL_UART_Transmit(&huart2,"my name is inc\r\n",sizeof("my name is inc\r\n"),1000);
  10.     LED_GREEN_TOGGLE;
  11.     HAL_Delay(1000);
  12.   }
  13.   /* USER CODE END 3 */
复制代码


因为我们在main中使用了printf,所以我们需要重定向printf函数:
我们打开usart.c
在user code区域中添加一下代码:
  1. #pragma import(__use_no_semihosting)            
  2.             
  3. struct __FILE
  4. {
  5.         int handle;
  6.         /* Whatever you require here. If the only file you are using is */
  7.         /* standard output using printf() for debugging, no file handling */
  8.         /* is required. */
  9. };
  10. /* FILE is typedef’ d in stdio.h. */
  11. FILE __stdout;      

  12. void _sys_exit(int x)
  13. {
  14.         x = x;
  15. }

  16. int fputc(int ch, FILE *f)
  17. {      
  18.         while((USART2->ISR&0X40)==0);  
  19.         USART2->TDR = (uint8_t) ch;      
  20.         return ch;
  21. }
复制代码
最后我们编译工程,并且下载,对于软件生成的工程,默认是没有设置stlink下载后的工作的,所以我们可以点击option,debug,stlink,setting,flash download,然后勾选reset and run,最后确定返回。
最后一步,下载工程。
一下是运行现象:
QQ截图20160309180051.png



相关推荐
STM32单片机官方开发工具一览
STM32评估开发板列表
ARM Cortex-M内核STM32 单片机产品全览
STM32微控制器参考设计
收藏 2 评论7 发布时间:2016-3-9 18:01

举报

7个回答
lising 回答时间:2016-3-9 19:02:21
不错,跟着楼主学习。
yklstudent-1794 回答时间:2016-3-10 12:56:13
楼主玩过HAL库下SPI驱动TF卡吗?
Inc_brza 回答时间:2016-3-10 13:48:45
yklstudent-1794 发表于 2016-3-10 12:56
楼主玩过HAL库下SPI驱动TF卡吗?

有空我再写个帖子吧,SPI通了,其他其实没有任何难度的,你可以看我下一个帖子,就关于SPI设置的
小温点秋香 回答时间:2017-4-13 11:57:36
楼主有没有 STM32F042 ,串口2 的demo,固件不要用CubMX的(非常繁复)。我对照调通的串口1,修改,但是串口2就是不能通信。
[cod,]void RCC_Configuration(void)
{   
        /* Enable SYSCFG clock */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); //EXTI 等时钟
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA |RCC_AHBPeriph_GPIOB |RCC_AHBPeriph_GPIOF, ENABLE);
        //允许串口1/2的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);        
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);               
      
}[/code]

  1. void Usart_Config(UI32 usart1_baud, UI32 usart2_baud)
  2. {
  3.         GPIO_InitTypeDef    GPIO_InitStructure;
  4.         USART_InitTypeDef   USART_InitStructure;
  5.         
  6.     //USART1     
  7.          GPIO_PinAFConfig(GPIOA, GPIO_PinSource9,GPIO_AF_1);
  8.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource10 ,GPIO_AF_1);
  9.            
  10.         // Configure USART1_Tx
  11.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_9  ;
  12.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  14.         GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
  15.         GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;        
  16.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  17.         
  18.         // Configure USART1_Rx
  19.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ;
  20.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  21.         GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
  22.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  23.         
  24.         USART_DeInit(USART1);
  25.    
  26.         //初始化第一个串口
  27.         USART_InitStructure.USART_BaudRate = usart1_baud;
  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_Init(USART1, &USART_InitStructure);

  34.         USART_Cmd(USART1, ENABLE);
  35.     USART_ClearFlag(USART1, USART_FLAG_TC);

  36.     //USART2   
  37.          GPIO_PinAFConfig(GPIOA, GPIO_PinSource2,GPIO_AF_1);
  38.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource3 ,GPIO_AF_1);
  39.            
  40.         // Configure USART2_Tx
  41.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_2  ;
  42.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  43.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  44.         GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
  45.         GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;        
  46.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  47.         
  48.         // Configure USART2_Rx
  49.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 ;
  50.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  51.         GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
  52.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  53.         
  54.         USART_DeInit(USART3);
  55.    
  56.         //初始化第二个串口
  57.         USART_InitStructure.USART_BaudRate = usart2_baud;
  58.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  59.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  60.         USART_InitStructure.USART_Parity = USART_Parity_No;
  61.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  62.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  63.         USART_Init(USART1, &USART_InitStructure);

  64. //        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

  65.         USART_Cmd(USART2, ENABLE);
  66.     USART_ClearFlag(USART2, USART_FLAG_TC);
  67. }
复制代码


代码如上,很怀疑串口二有什么特殊,关于042的资料和很少!!
望回复!!多谢
Inc_brza 回答时间:2017-4-13 16:46:21
小温点秋香 发表于 2017-4-13 11:57
楼主有没有 STM32F042 ,串口2 的demo,固件不要用CubMX的(非常繁复)。我对照调通的串口1,修改,但是串 ...
  1. /**
  2.   ******************************************************************************
  3.   * @file    printf.c
  4.   * @author  Inc Li
  5.   * @version V0.0.1
  6.   * @date    5-April-2017
  7.   * @brief   Driver of GPIO
  8.   * @modify
  9.   ******************************************************************************
  10.   */

  11. /* Includes ------------------------------------------------------------------*/
  12. #include <stdio.h>
  13. #include "../devices.h"
  14. #include "stm32f0xx.h"

  15. /* Private typedef -----------------------------------------------------------*/
  16. /* Private define ------------------------------------------------------------*/
  17. #ifndef NULL
  18.     #define NULL 0
  19. #endif
  20. /* Private macro -------------------------------------------------------------*/
  21. #ifdef __GNUC__
  22.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
  23.      set to 'Yes') calls __io_putchar() */
  24.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  25.   #define GETCHAR_PROTOTYPE int __io_getchar(void)
  26. #else
  27.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  28.   #define GETCHAR_PROTOTYPE int fgetc(FILE *f)
  29. #endif /* __GNUC__ */
  30. /* Private variables ---------------------------------------------------------*/
  31. static usart_dev print;
  32. /* Private function prototypes -----------------------------------------------*/
  33. static int usart2_open(usart_param *property);
  34. static int usart2_close(usart_param *property);
  35. static int usart2_send_char(char dat);
  36. static char usart2_get_char(void);

  37. /* Private functions ---------------------------------------------------------*/
  38. int printf_dev_open(usart_param *property)
  39. {
  40.     return usart_open(&print, property);
  41. }

  42. char printf_dev_get(void)
  43. {
  44.     return usart_get(&print);
  45. }

  46. static int usart2_open(usart_param *property)
  47. {
  48.     USART_InitTypeDef uart;
  49.     GPIO_InitTypeDef gpio;

  50.     /* Enable GPIO Clock */
  51.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

  52.     /* Enable USART Clock */
  53.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

  54.     /* Connect PXx to USARTx_Tx */
  55.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1);

  56.     /* Connext PXx to USARTx_Rx */
  57.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource15, GPIO_AF_1);

  58.     /* Configure USART Tx as alternate function push-pull */
  59.     gpio.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_15;
  60.     gpio.GPIO_Mode = GPIO_Mode_AF;
  61.     gpio.GPIO_Speed = GPIO_Speed_10MHz;
  62.     gpio.GPIO_OType = GPIO_OType_PP;
  63.     gpio.GPIO_PuPd = GPIO_PuPd_UP;
  64.     GPIO_Init(GPIOA, &gpio);

  65.     uart.USART_BaudRate = property->baudrate;
  66.     switch (property->word_lenth) {
  67.         case USART_WORD_LENTH_7BIT:
  68.             uart.USART_WordLength = USART_WordLength_7b;
  69.             break;
  70.         case USART_WORD_LENTH_8BIT:
  71.             uart.USART_WordLength = USART_WordLength_8b;
  72.             break;
  73.         case USART_WORD_LENTH_9BIT:
  74.             uart.USART_WordLength = USART_WordLength_9b;
  75.             break;
  76.         default:
  77.             goto err;
  78.     }

  79.     switch (property->stopbit) {
  80.         case USART_STOP_BIT_1:
  81.             uart.USART_StopBits = USART_StopBits_1;
  82.             break;
  83.         case USART_STOP_BIT_1_5:
  84.             uart.USART_StopBits = USART_StopBits_1_5;
  85.             break;
  86.         case USART_STOP_BIT_2:
  87.             uart.USART_StopBits = USART_StopBits_2;
  88.             break;
  89.         default:
  90.             goto err;
  91.     }

  92.     switch (property->parity) {
  93.         case USART_PARITY_NONE:
  94.             uart.USART_Parity = USART_Parity_No;
  95.             break;
  96.         case USART_PARITY_EVEN:
  97.             uart.USART_Parity = USART_Parity_Even;
  98.             break;
  99.         case USART_PARITY_ODD:
  100.             uart.USART_Parity = USART_Parity_Odd;
  101.             break;
  102.         default:
  103.             goto err;
  104.     }

  105.     switch (property->usart_mode) {
  106.         case USART_MODE_RX:
  107.             uart.USART_Mode = USART_Mode_Rx;
  108.             break;
  109.         case USART_MODE_TX:
  110.             uart.USART_Mode = USART_Mode_Tx;
  111.             break;
  112.         case USART_MODE_RX_TX:
  113.             uart.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  114.             break;
  115.         default:
  116.             goto err;
  117.     }

  118.     switch (property->hardware_flow_control) {
  119.         case USART_HARDWARE_CONTROL_NONE:
  120.             uart.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  121.             break;
  122.         case USART_HARDWARE_CONTROL_RTS:
  123.             uart.USART_HardwareFlowControl = USART_HardwareFlowControl_RTS;
  124.             break;
  125.         case USART_HARDWARE_CONTROL_CTS:
  126.             uart.USART_HardwareFlowControl = USART_HardwareFlowControl_CTS;
  127.             break;
  128.         case USART_HARDWARE_CONTROL_RTS_CTS:
  129.             uart.USART_HardwareFlowControl = USART_HardwareFlowControl_RTS_CTS;
  130.             break;
  131.         default:
  132.             goto err;
  133.     }

  134.     USART_DeInit(USART2);
  135.     USART_Cmd(USART2, DISABLE);
  136.     USART_Init(USART2, &uart);
  137.     USART_Cmd(USART2, ENABLE);
  138.     USART_ClearFlag(USART2, USART_FLAG_TC);
  139.     return 0;
  140. err:
  141.     return 1;
  142. }

  143. int printf_dev_send(char *str)
  144. {
  145.     while (*str != 0) {
  146.         print.send_char(*str++);
  147.     }
  148.     return 0;
  149. }

  150. static int usart2_close(usart_param *property)
  151. {
  152.     return 0;
  153. }

  154. static int usart2_send_char(char dat)
  155. {
  156.     USART_SendData(USART2, (uint8_t)dat);
  157.     while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET) {
  158.     }
  159.     return 0;
  160. }

  161. static char usart2_get_char(void)
  162. {
  163.     while (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET);

  164.     return (char)USART_ReceiveData(USART2);
  165. }

  166. /**
  167.   * @brief  重定向c库函数printf到USART1
  168.   * @param  
  169.   * @retval
  170.   */
  171. PUTCHAR_PROTOTYPE
  172. {
  173.     //while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);               
  174.     //USART_SendData(USART2, (uint8_t) ch);
  175.     while((USART2->ISR & USART_FLAG_TXE) == 0);
  176.     USART2->TDR = ch;
  177.     return (ch);
  178. }


  179. /**
  180.   * @brief  重定向c库函数scanf到USART1
  181.   * @param  
  182.   * @retval
  183.   */
  184. GETCHAR_PROTOTYPE
  185. {
  186.     while (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET);

  187.     return (int)USART_ReceiveData(USART2);
  188. }

  189. static usart_dev print = {
  190.     .open = usart2_open,
  191.     .close = usart2_close,
  192.     .send_char = usart2_send_char,
  193.     .get_char = usart2_get_char,
  194. };
  195. /******************* (C) COPYRIGHT 2016 Inc *****END OF FILE*******************/

复制代码
include 回答时间:2019-2-20 17:56:03
小温点秋香 发表于 2017-4-13 11:57
楼主有没有 STM32F042 ,串口2 的demo,固件不要用CubMX的(非常繁复)。我对照调通的串口1,修改,但是串 ...

我也遇到了同样的问题,你找到原因了吗?
include 回答时间:2019-2-20 17:59:17

这个我试了一下,用不了

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

官网相关资源

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