完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
高手问答第9期——STM32问答
活动时间:2014.9.1-2014.9.7 Q:端口配置锁定寄存器(GPIOx_LCKR)这个寄存器是具体怎么配置,看了半天数据手册没看懂。1:端口配置锁键位被激活,下次系统复位前GPIOx_LCKR寄存器被锁住。 锁键的写入序列: 写1 -> 写0 -> 写1 -> 读0 -> 读1 最后一个读可省略,但可以用来确认锁键已被激活。 注:在操作锁键的写入序列时,不能改变LCK[15:0]的值。 操作锁键写入序列中的任何错误将不能激活锁键。能给个代码示例么,这样更好理解 感激不尽 A :打开keil安装目录你会找到很多的例子的,比如我的安装目录是D:Program Files打开 D:Program FileskeilARMExamplesSTSTM32F10xFWLibExamplesGPIOIOToggle你会看到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 %drn", 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 A :你说的是程序下载吗,看看装了驱动没,还有串口号选对没,再就是tx/rx管脚插反没有,一般就是这些情况了 Q:NVIC->IPR[10] &= ~(0xF<<0); NVIC->IPR[10] |= (0xA<<4); 放了这么两句代码,出现错误, USRmain.c(42): error: #136: struct " 应该是缺少头文件吧,不知道需要什么头文件。我已经加了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数据清空哦,切换的寄存器也要改过来,如果还有什么问题可以再问哦 |
|
|
|
|
|
这么难懂啊,只是了解下
|
|
|
|
|
|
不错的问答,有收获。
|
|
|
|
|
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
1423 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1359 浏览 3 评论
2902 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1504 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1934 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-3 05:41 , Processed in 0.962040 second(s), Total 84, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号