微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > Elecfans高手问答Q&A——STM32问答

Elecfans高手问答Q&A——STM32问答

时间:10-02 整理:3721RD 点击:



本帖非活动贴,我们将活动中的Q&A做了整合,方便大家共同学习。



Elecfans社区问答已经在大家的积极参与下全面展开,我们会在每一期活动结束后,将帖子中的精华问


答整合于此,方便大家翻阅,共同学习,共同进步。


******************为了给大家一个方便的阅读环境,请不要在本帖回复,谢谢配合******************




高手问答第9期——STM32问答

活动时间:2014.9.1-2014.9.7

活动链接:http://bbs.elecfans.com/jishu_447840_1_1.html



Q:端口配置锁定寄存器(GPIOx_LCKR)这个寄存器是具体怎么配置,看了半天数据手册没看懂。1:端口配置锁键位被激活,下次系统复位前GPIOx_LCKR寄存器被锁住。 锁键的写入序列: 写1 -> 写0 -> 写1 -> 读0 -> 读1 最后一个读可省略,但可以用来确认锁键已被激活。 注:在操作锁键的写入序列时,不能改变LCK[15:0]的值。 操作锁键写入序列中的任何错误将不能激活锁键。能给个代码示例么,这样更好理解
感激不尽
A :打开keil安装目录你会找到很多的例子的,比如我的安装目录是D:\Program Files\打开
D:\Program Files\keil\ARM\Examples\ST\STM32F10xFWLib\Examples\GPIO\IOToggle你会看到gpio的操

作案例
例如下面代码
/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
* File Name          : main.c
* Author             : MCD Application Team
* Version            : V2.0.1
* Date               : 06/13/2008
* Description        : Main program body.
********************************************************************************
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_lib.h"
#include "platform_config.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
GPIO_InitTypeDef GPIO_InitStructure;
ErrorStatus HSEStartUpStatus;
/* Private function prototypes -----------------------------------------------*/
void RCC_Configuration(void);
void NVIC_Configuration(void);
void Delay(vu32 nCount);
/* Private functions ---------------------------------------------------------*/
/*******************************************************************************
* Function Name  : main
* Description    : Main program.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
int main(void)
{
#ifdef DEBUG
  debug();
#endif
  /* System Clocks Configuration **********************************************/
  RCC_Configuration();   
  /* NVIC Configuration *******************************************************/
  NVIC_Configuration();
  /* Configure all unused GPIO port pins in Analog Input mode (floating input
     trigger OFF), this will reduce the power consumption and increase the device
     immunity against EMI/EMC *************************************************/
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
                         RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |
                         RCC_APB2Periph_GPIOE, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  GPIO_Init(GPIOE, &GPIO_InitStructure);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
                         RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |
                         RCC_APB2Periph_GPIOE, DISABLE);  
#ifdef USE_STM3210E_EVAL
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG, ENABLE);
  GPIO_Init(GPIOF, &GPIO_InitStructure);
  GPIO_Init(GPIOG, &GPIO_InitStructure);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG, DISABLE);
#endif /* USE_STM3210E_EVAL */
  /* Configure IO connected to LD1, LD2, LD3 and LD4 leds *********************/
  /* Enable GPIO_LED clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_LED, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIO_LED, &GPIO_InitStructure);
  while (1)
  {
    /* Turn on LD1 */
    GPIO_SetBits(GPIO_LED, GPIO_Pin_6);
    /* Insert delay */
    Delay(0xAFFFF);
    /* Turn on LD2 and LD3 */
    GPIO_SetBits(GPIO_LED, GPIO_Pin_7 | GPIO_Pin_8);
    /* Turn off LD1 */
    GPIO_ResetBits(GPIO_LED, GPIO_Pin_6);
    /* Insert delay */
    Delay(0xAFFFF);
    /* Turn on LD4 */
    GPIO_SetBits(GPIO_LED, GPIO_Pin_9);
    /* Turn off LD2 and LD3 */
    GPIO_ResetBits(GPIO_LED, GPIO_Pin_8 | GPIO_Pin_7);
    /* Insert delay */
    Delay(0xAFFFF);
    /* Turn off LD4 */
    GPIO_ResetBits(GPIO_LED, GPIO_Pin_9);
  }
}
/*******************************************************************************
* Function Name  : RCC_Configuration
* Description    : Configures the different system clocks.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RCC_Configuration(void)
{   
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();
  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);
  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();
  if(HSEStartUpStatus == SUCCESS)
  {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);
  
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
  
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1);
    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);
    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
    /* Enable PLL */
    RCC_PLLCmd(ENABLE);
    /* Wait till PLL is ready */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }
    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }
}
/*******************************************************************************
* Function Name  : NVIC_Configuration
* Description    : Configures Vector Table base location.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void NVIC_Configuration(void)
{
#ifdef  VECT_TAB_RAM  
  /* Set the Vector Table base location at 0x20000000 */
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
#endif
}
/*******************************************************************************
* Function Name  : Delay
* Description    : Inserts a delay time.
* Input          : nCount: specifies the delay time length.
* Output         : None
* Return         : None
*******************************************************************************/
void Delay(vu32 nCount)
{
  for(; nCount != 0; nCount--);
}
#ifdef  DEBUG
/*******************************************************************************
* Function Name  : assert_failed
* Description    : Reports the name of the source file and the source line number
*                  where the assert_param error has occurred.
* Input          : - file: pointer to the source file name
*                  - line: assert_param error line source number
* Output         : None
* Return         : None
*******************************************************************************/
void assert_failed(u8* file, u32 line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* Infinite loop */
  while (1)
  {
  }
}
#endif
/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/


Q:int main(void)
{
        unsigned char i,data;
        USART_InitTypeDef USART_InitStructure;
        RCC_Configuration();
        GPIO_Configuration();
        USART_InitStructure.USART_BaudRate = 9600;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No;
        USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
        USART_Init(USART1, &USART_InitStructure);
        USART_Cmd(USART1,ENABLE);
        data = 'A';
        for(i=0; i<10; i++)
        {
               
                USART_SendData(USART1,data);
                data++;
                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);               
        }
}
我明明循环了10次,却只打印出了9个数据,原本想输出“ABCDEFGHIJ”,但是实际输出出来的是“ACDEFGHIJ”这是为什么呢?求大侠解惑
A :while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET)
把后面一句换成这个试试,亲!

Q:笔记本虚拟2端口,然后keil下   输入 MODE COM4 115200,0,8,1 ASSING COM4<S2IN>S2OUT   提示*** error 76: command not supported  怎么解决@指上谈兵123
A :你说的是程序下载吗,看看装了驱动没,还有串口号选对没,再就是tx/rx管脚插反没有,一般就是这些情况了


Q:NVIC->IPR[10]  &= ~(0xF<<0);
NVIC->IPR[10]  |=  (0xA<<4);
放了这么两句代码,出现错误,
USR\main.c(42): error:  #136: struct "<unnamed>" has no field "IPR"
应该是缺少头文件吧,不知道需要什么头文件。我已经加了stm32f10x_nvic.h了,难道还要什么头文件?求助
A :你仔细查看一下吧,应该是缺少这个文件
Q:stm32的寄存器是  32位的  然而 操作也只能是以 32位的形式操作,  小弟想 单独对某一位操做  应该怎么做呢  就像8位的单片机一样可以写作PTA_PTA1=1(表示A口pin1置1).  用结构体联合体的方式应该怎么做呢?  或者还有什么其他的办
A :可以的,你可以查看stm32f10x.h的定义,里面就可以对位的操作,注意数据类型的定义方式,希望能帮到你,代码太多,你自己去找吧

Q:static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);           
  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  
  SysTick->VAL   = 0;                                       
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;                   //尤其是对寄存器操作这句
  return (0);
}
这段代码不是很懂 求大神解释!
A :能不能把你的具体哪个文件告诉我啊,这样找下去会死人的,程序员的命很短暂的
Q:怎么通过SPI 发送24位的数据比如发
0xa00000,0xa04000,0xa08000,0xa0C000,0xa10000,0xa14000,0xa18000,0xa40000,0xa44000,等不能分开
A:Spi是一种电器接口,要符合他的具体协议的,那么他只能8个数据一组一组的发了,如果你要发24位数据,其实你要关心的是数据的大小端,主从关系等方面问题,希望能帮到你
Q:求助@指上谈兵123 。
例如我在STM32上外接几个按键,实现以下功能:
按下按键1:发送数据1到串口;
按下按键2:发送数据2到串口。
预留几个按键接口。
现在我想通过上位机来实现程序的增加和删除功能,实现通过上位机删除按键x(如按键1、按键2)的功
能,增加按键x的功能(按下按键x,发送数据x到串口)。请问应该怎么去实现?A:这个是纯粹是上位机
的问题,我不太好回答,但是用stm32做按键程序和串口程序还是比较简单的,网上代码很多的
Q:刚刚初学stm32,请问学习STM32库函数有什么好的方法呢@指上谈兵123
A:学习库函数,其实没有那么复杂,用到那个就去学那个,注意库函数的类型定义以及函数处理的技巧
,这些库函数是高手做出来,有很多借鉴意义,如果你是初学的话,你还是准备多编译几遍吧,学学怎
么创建工程什么的,如果还有不懂可以来找我啊!


Q:刚刚接触M3,请教一下是不是根据自己的设计需修改库函数啊,例如控制GPIO的库里面的宏定义只有GPIO_Pin_0。GPIO_Pin_15还有GPIO_Pin_All,如果我要同时用 1和2脚,是不是可以把库里面的宏定义的寄存器值修改一下啊,试了一下可以的,但是不知道大神一般怎么做的?@指上谈兵123
A:不要这样,库函数的文件最好不要该他,如果是用1和2脚可以用或的方式操作,例如
GPIO_Pin_0|GPIO_Pin_1
Q:最近在做彩屏产品的升级方案,现在用的是STM32F103VET与周立功的MT210G16来来做的,由于彩屏显示的数据量大,还兼有其他功能,产品在使用中刷新速度慢,偶尔会有卡屏现象,所以想找一款价格低廉性能优越的ARM芯片来取代现有的这种设计方案  @指上谈兵123 有建议吗
A:呵呵,没有建议,因为STM32频率算是很高的的了,看能不能在软件上有所修改,如果屏幕的操作要求高的话可以选再高档点的芯片罗,那估计得要上操作系统了
Q:
端口配置锁定寄存器(GPIOx_LCKR)这个寄存器是具体怎么配置,看了半天数据手册没看懂。1:端口配置锁键位被激活,下次系统复位前GPIOx_LCKR寄存器被锁住。 锁键的写入序列: 写1 -> 写0 -> 写1 -> 读0 -> 读1 最后一个读可省略,但可以用来确认锁键已被激活。 注:在操作锁键的写入序列时,不能改变LCK[15:0]的值。 操作锁键写入序列中的任何错误将不能激活锁键。@指上谈兵123
A:嗯,这个不知道如何解释,可以看一下例程代码吧,用到哪里看哪里罗
Q:在使用si4432时,单工可以很好实现,一个收另一个发,没有问题。现在要做双工通信,默认情况为接收状态,接收结果显示在串;串口触发SI4432发送。但是现在出现一个问题是:当发送的时候,在发送方串口会同时显示上次接受的数据的第一个数据并和上次接收数据个数一样。我一步一步调试发现两个中断位都响应了,但是我在发送后的中断函数最后默认了接收模式啊。请大神@指上谈兵123 给点指示,要注意哪些A:呵呵呵呵,你也在用si4432啊,我也在用哦,调试代码的痛苦我感同身受,si4432的在接受状态切换到发送状态时要把FIFO数据清空哦,切换的寄存器也要改过来,如果还有什么问题可以再问哦

这么难懂啊,只是了解下

。太难  就看一下

不错的问答,有收获。

拿分走人  居然还限制字数了,没办法只能多打几个字。

大神,怎么学深天马2啊,特别是库函数好难学。

PA6,PA7既是tim3的引脚  又是adc1的引脚  以下几种情况麻烦大神帮忙看看:1.tim3开启  adc1也开启 那么这两个脚会是什么情况 ?2.会不会因为存在公用的引脚导致某一个无法正常开启?3.如果开启了adc1,那么我又想使用tim3,如果我只使用其他两个通道PB0 PB1可行吗?4.如果开启了tim3,那么我又想使用adc1,如果我只使用其他几个通道可行吗?

这么优秀的帖子,得支持啊。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top