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

(续)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个回答
lisingch 回答时间:2016-3-9 19:02:21
不错,跟着楼主学习。
yklstudent 回答时间: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*******************/

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

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

这个我试了一下,用不了

所属标签

相似分享

官网相关资源

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