用计时器编程旋转编码器
我已经设计了一个具有STM32F103CBT6微控制器和16 MHz晶体振荡器的自定义PCB.该板具有一个按钮矩阵,带有16个按钮,2个独立按钮和4个旋转编码器. 我使用轮询方法成功地编程了按钮矩阵和独立按钮来检查按钮状态,但我现在正在应对编程旋转编码器的挑战.我正在探索两个选项. 第一个选项涉及将所有编码器引脚设置为gpio_input并监视状态更改,类似于按钮矩阵(例如,在引脚低时注册输入).但是,这引入了引脚上的弹跳/跳跃,导致不正确或重复输入. 第二种选择是向我推荐的,它正在与计时器合作.每个编码器都连接到计时器的通道1和通道2.例如,编码器1连接到计时器1(通道1 = PA8和通道2 = PA9),编码器2到计时器2(通道1 = PA0和通道2 = PA1),Encoder 3到计时器3(通道1 = PA6和PA6和通道2 = PA7),然后编码4到计时器4(通道1 = PB6和通道2 = PB7). 我不太熟悉与STM32上的计时器合作,因此我在网上寻
6 2024-04-10
编程技术问答社区
在STM32f779ii上设置双库模式
我正在尝试为STM32F779II设置双银行模式,但根本没有设置. 所以我在执行以下代码之前先尝试了主机 HAL_FLASH_Unlock(); HAL_FLASH_OB_Unlock(); FLASH->OPTCR |= FLASH_OPTCR_nDBANK_Msk; HAL_FLASH_OB_Lock(); HAL_FLASH_Lock(); ,当我尝试检查内存是单个还是双模式时: if((OBInit.USERConfig & OB_NDBANK_SINGLE_BANK) == OB_NDBANK_DUAL_BANK){ printf("Dual bank mode is set"); } 但是该语句永远不会设置为真. 解决方案 该过程在参考手册中描述. 要修改用户选项值,请按照以下顺序: 通过检查BSY位,检查是否正在进行闪存操作 flash_sr寄存器 在flash_optcr寄存器中
0 2024-04-10
编程技术问答社区
在STM32H7上使用执行跟踪片上缓冲器(ETB)
在某些特定情况下,我需要输出片上缓冲区(ETB)执行跟踪.我说的是操作功能,而不是在调试阶段的ETM跟踪. 我已经阅读了ARM®CORESIGHT™ETM-M7技术参考手册,但使用此ETB功能几乎没有细节. 还有如何使用ETB? 编辑:由于Stmicro的演讲,我澄清了情况.它指出" 可以将ETF用作固定痕迹的痕量缓冲区.可以通过软件或调试器读取跟踪, 或通过微量端口冲洗.如果配置为圆形缓冲区, 痕迹将连续存储,因此最近的迹线 将覆盖最古老的.或者,FIFO全旗可以 当缓冲区已满时,可用于停止迹线,因此 在特定时间点捕获痕迹. 是的目标设备一直连接到外部调试捕获设备. ETM跟踪可能是完全不受欢迎的(除了具有逻辑活动的额外功耗成本外). 该体系结构非常通用,尽管每个实现都会在实施的方面做出不同的权衡.不幸的是,这意味着文档已经扩散了.您可能会发现此对于上下文(但不是细节). 要实现崩溃分析,您需要介绍以下步骤: 在圆形缓冲区模式下配置ETF 配置
0 2024-04-10
编程技术问答社区
如何在应用程序(stm32f4 HAL)中改变SCB->VTOR?
i为STM32F4构建引导加载程序,并使用更改使用System_stm32f4xx.c File中的SCB-> VTOR的VECT_TAB_OFFSET值来构建用户应用程序,但如果我在应用程序中进行操作.它无法正常工作. 我在main()开头的scb--> vtor = 0x8040000 = 0x8040000. " nofollow noreferrer"> bootloader 解决方案 main()之前的STM32启动代码调用SystemInit(). SystemInit()设置SCB->VTOR值(除其他事项外). SystemInit()在提供的文件system_stm32f4xx.c中实现.您可以通过编辑VECT_TAB_OFFSET的值来自定义分配给SCB-VTOR的值,该值也在system_stm32f4xx.c中定义. (您的项目文件夹中应该有system_stm32f4xx.c的副本,您可以为项目自定义.) 如果您需要启动和应用程序的不同值VECT_
4 2024-04-10
编程技术问答社区
STM32应用程序有时不能运行,一直处于DFU状态
更新: STM32L4板的问题有时在DFU更新后不会运行,跳到编辑2以获取短篇小说和示例代码. 我正在使用基于STM32L4的自定义板进行项目. 在将字符串通过USB发送之前,我一直在格式化字符串时遇到问题. 当使用USB上的DFU更新MCU时,问题就会发生,在调试模式下一切正常(使用stlink). 当将3个以上的参数传递给sprintf时,MCU会离开DFU模式,但是该应用程序永远不会启动(没有初始步骤,没有运行,什么也没有). 我已经追踪了引起问题的线路: sprintf(tx_buffer, "Hello World: %ld/%ld/%ld\r\n", 1,2,3); // OK sprintf(tx_buffer, "Hello World: %ld/%ld/%ld, %ld\r\n", 1,2,3, 4); // NOK sprintf(tx_buffer, "Hello World: %d/%d/%d\r\n", 1,2
0 2024-04-10
编程技术问答社区
在ARM Cortex M4处理器中,测试C代码中的错误SEGV对耗时的影响
我正在为我的STM32F429板的嵌入式操作系统编写代码.我正在测试此代码的经过时间: #include #include #include #include #include #include #define DEFAULT_DELAY 1 uint32_t m_nStart; //DEBUG Stopwatch start cycle counter value uint32_t m_nStop; //DEBUG Stopwatch stop cycle counter value #define DEMCR_TRCENA 0x01000000 /* Core Debug registers */ #define DEMCR (*((volatile ui
0 2024-04-10
编程技术问答社区
Nucleo STM32f103RB/F4的发现
是否有人使用VCP在核/或Discovery单一USART上使用RX TX中断的单一USART进行了使用. 会喜欢示例代码回声回声(传输)收到的内容. 解决方案 stm32cubef1 package. 另外,请参见此示例,其中微控制器echos使用UART RX中断将接收到的字节回到发送方: : #include "stm32f4xx.h" UART_HandleTypeDef huart2; /* Single byte to store input */ uint8_t byte; void SystemClock_Config(void); /* UART2 Interrupt Service Routine */ void USART2_IRQHandler(void) { HAL_UART_IRQHandler(&huart2); } /* This callback is called by the HAL_UART_IRQHand
0 2024-04-10
编程技术问答社区
STM32CubeF7 BSP LCD尝试
我正在尝试在STM32F769I-DISCO的LED上显示一个带有来自STM32CUBEF7的BSP库的LED.但是,什么都没有发生.这是代码: #include "stm32f7xx_hal.h" #include "stm32f769i_discovery.h" #include "stm32f769i_discovery_lcd.h" #include "stm32f7xx.h" #include char str[] = "Hello from BSP LCD demo!"; void LCDInit() { // Initialize the LCD using the BSP_LCD_Init() function. BSP_LCD_Init(); // Select the LCD layer to be used using the BSP_LCD_SelectLayer() function. //BSP_
0 2024-04-10
编程技术问答社区
没有MPU9255上的磁力计的数据
我在MPU9255上从磁力计读取数据时有问题.加速度计和陀螺仪正常工作,但我没有从磁力计中收到任何数据.我正在研究STM32F103目标. 有人知道下面的代码有什么问题? uint8_t Settings = 0x00; uint8_t SettingsM = 0x00; uint8_t SettingsL = 0x22; //mode2 16bit //settings accelerometer and gyroscope HAL_I2C_Mem_Write(&hi2c1, 0xD0, 27, I2C_MEMADD_SIZE_8BIT, &Settings,1,1000); HAL_I2C_Mem_Write(&hi2c1, 0xD0, 28, I2C_MEMADD_SIZE_8BIT, &Settings,1,1000); //Power Down mode HAL_I2C_Mem_Write(&hi2c1, 0x0C, 0x0A, I2C_MEMADD_
0 2024-04-10
编程技术问答社区
通过函数调用为缓冲区分配内存
我有一个函数f(q15_t *x, inst *z)它具有输入x和一个实例z: typedef struct { q15_t * pbuff; }inst; inst z; 我希望一个初始化功能能够分配内存空间并将其地址分配给z.pbuff,就像(我的努力): instance_initiator(inst *instance,uint16_t buffSize) { q15_t a[buffSize]; instance->pbuff=a; } 我正在寻找正确的方法来执行此操作,因为我认为启动器功能完成缓冲区分配的空间后会消失,而且似乎我们需要全局变量,而这可能是通过使a静态来实现吗?我希望能够做到这一点. 请注意,初始化将运行一次,该功能将被称为多次. 正如莫斯科的弗拉德(Vlad)所说的malloc很好,但我担心这是否放慢了算法?也许一种方法是设置Macro的静态数组a的大小. 解决方案 我已经找到了一个解决方案,但是我不知道是否有人命名此
0 2024-04-10
编程技术问答社区
如何用Nucleo-F303K8做每1us的adc转换?
IM使用STM32立方体IDE.我现在尝试的是在频道1上启用MSM和output_compare_no_output中的MSM,然后选择"重置"作为触发事件.然后,我转到ADC1并启用了常规_conversion_mode,将number_of_conversions设置为1,将external_trigger_conversion_source设置为Timer 2触发事件.之后,我以圆形模式设置了DMA,将半词推到RAM缓冲区.为了进行测试,我将计时器的频率设置为较低(10Hz),并通过conshalfcoplt和Convcoplt中的UART从缓冲区发送一些ADC读数.但是目前它不起作用.你能考虑我的方法中的任何错误吗? #include "main.h" #include #include #define ADC_BUF_LEN 4096 ADC_HandleTypeDef hadc1; DMA_HandleTypeDef hdm
0 2024-04-09
编程技术问答社区
从一个32位的计时器中获取64位的时间戳
在我的STM32WB55上,我使用32bit-Timer" TIM2"来读取自系统启动以来32位注册" CNT"的时间.有了预示,我在油腻的console上显示了微秒的时间,并且效果很好.但是现在,我需要记忆更高的值.因此,我想在64位整数中记忆时间. 有人知道这样做的简单方法吗? 解决方案 tim2计时器是32位分辨率计时器,您需要64位分辨率.有两种模拟64位计数器的方法,以跟踪您的正常运行时间. 每次您达到要跟踪的时间单位时,都会增加变量.但这将极低效率,使微控制器将进行很多恒定的上下文切换. 第二种方法是用32位变量扩展计时器.然后在溢出上增加此类变量. MSB LSB +--------------+ +--------------+ | 32bit uint | | 32bit timer | +--------------+ +--------------+ 此工作的方法是,在计时
0 2024-04-09
编程技术问答社区
STM32F407注册级别时钟配置问题
我在STM32F407发现板上工作.但是我没有解决我的时钟配置问题.我想达到168 MHz的工作频率,并从Cubemx时钟配置管理器那里获得帮助.这是我的PLLCFGR寄存器值,来自Cubemx:0x4405408. (我对此寄存器有问题).然后,我将所有RCC寄存器复制到我的CMSIS代码中.这是我的时钟配置代码: RCC->CFGR = 0x4008940A; //MCO2 Source is PLLI2S (4), HSE Divided by 8 for RTC (8), APB2 Divided by 2 for 84Mhz, APB1 Divided by 4 for 42 Mhz RCC->CR = 0x0F0B6783; //PLL, PLLI2S, HSE, CSS ON RCC->PLLCFGR = 0x04405408; //PLLQ 4 (4), PLLSRC = HSE (4), PLLP 2 (0), PLLN 3
0 2024-04-09
编程技术问答社区
SPI_I2S_ReceiveData 总是返回 0xff 或 0x00
我想为板移动时创建固件,从而将固件闪烁.但是SPI_I2S_ReceiveData总是返回0xff或0x00.我认为问题在我的SPI初始化中,但我不知道它到底在哪里. 这是我的代码. #include #include #include #include #include void InitLEDs(void); void InitSPI(void); void Delay(int iTicks); void DiodeFlash(void); unsigned short ReadACCELEROMETER(void); unsigned char WriteSPI(unsigned char cbData); int main(void) { unsigned short cbP
26 2024-04-09
编程技术问答社区
重新启动后的位域keil硬故障
当我在闪烁设备后使用此结构时,它运行良好,但是在使用此结构(分配到任何位)重新启动(打开/关)后,会导致硬故障IRQ.我将Keil Uvision与STM32F205一起使用.为什么它不起作用?我应该更改/删除/添加以修复它?直接使用gpioc-> odr不会引起任何问题,kail中的bitfields有什么问题? #pragma anon_unions typedef union { struct { __IO uint16_t Data_Bus:8; // 0-7 data bus __IO uint16_t Ctr_Pins:6; // 8-13 control pins __IO uint16_t :2; // 14-15 unused here }; struct { __IO uint16_t D0:1; // 0 data bus pin
4 2024-04-09
编程技术问答社区
在基于自定义 USB CDC 类的 STM32 设备上,我无法接收超过 64 个字节的数据。
目前,我尝试将Windows应用程序从Windows应用程序发送到自定义STM32设备(现在用于测试目的我使用蓝色药丸-STM32F103XXX).啊,我忘了指出我完全是新手的编程:).因此,在设备方面,我有1000个字节缓冲区可接收和发送(感谢STMCUBE).使用终端程序(数据包 计算正弦编织(360)样品-16字节大小 将它们发送到USB设备为720字节(COM端口的字节大小协议) 我的问题是,设备不超过64个字节. 我在某个地方阅读了此原因,可以插入内置的RX,TX Windows Buffer(64个字节长,在Internet上的某个地方长时间提及),为此,我将其插入下面的代码:我插入: setupComm(HCOM,1000,1000) 希望这能解决我的麻烦,但不.以下是"我的"代码,有什么想法我如何解决? #include #include #include #inc
0 2024-04-09
编程技术问答社区
FATFS不能初始化SD卡。
所以我使用的是STM32F407,并试图用FATFS写入SD卡.我已经使用CUBEMX生成了胖层和4bit SDIO配置软件的代码.我已将以下代码添加到MAIN中以测试代码是否有效. UINT bw; f_mount(&FatFs, "", 0); /* Give a work area to the default drive */ /* Create a file */ if(f_open(&Fil, "newfile.txt", FA_WRITE | FA_CREATE_ALWAYS) == FR_OK) { f_write(&Fil, "It works!\r\n", 11, &bw); /* Write data to the file */ f_close(&Fil); /* Close the file */ if (bw == 11) { /*
4 2024-04-09
编程技术问答社区
如何用sprintf显示一个64位无符号整数?
我在油灰孔上显示32位计时器值.自从我的STM32WB55启动以来,计时器包括微秒中的时间.使用以下代码,它像我想要的那样效法: uint32_t time_micro32 sprintf((char*)buf, "Time: %lu \r\n", (time_micro32)); 但是现在,我想用uint64_t time_micro64以64位分辨率显示时间.我尝试了很多,但没有任何效果.有人可以帮我吗?我在stm32Cubeide中编程 解决方案 我在STM32Cubeide中编程 因此,您最有可能在其" Nano"版本中使用Newlib - Newlib的较小版本,该版本无法处理打印64位变量. 与完整的newlib版本(或使用其他C标准库)链接,该代码可以正常工作.搜索您的GUI-应该有一个选项,例如"使用-Nano版本的标准库"或" Pass -specs = nano.specs到编译器".取消选
0 2024-04-09
编程技术问答社区
STM32 HAL rx中断不能正确获取字节
嗨,我正在尝试使用STM32 HAL库中断串行Rx,我遇到了我不知道的错误. 这是非常简单的程序. PC给STM32板和STM32的字节将使用Rx中断例程采用这些字节. 问题是,当我发送4个字节以上,例如" 12345"时,STM32板仅获得4个字节,最后一个字节(5)在某个地方消失了.这是可以更好地理解的图片. 这是我的代码hal_uart_rxcpltcallback例程: HAL_UART_Transmit(&huart4, &receive1, 1, 1000); HAL_UART_Receive_IT(&huart4, &receive1, 1); 如果您有任何想法,请评论:) 解决方案 检查功能:HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); 例如,大小像16 byte一样; 将您的HAL_UART_RxCpltCall
2 2024-04-09
编程技术问答社区
STM32 : FatFs库-f_mount
我正在编程STM32F0(Keil Uvision 5). 我尝试使用FATFS库来管理文件系统(SD卡).我已经写下了每个初始化功能,并且该项目正在编译,没有任何错误/警告.但是第一个功能f_mount无法正常工作.功能调用是: const char sciezka = '0' ; FATFS *fs = (void *) 0; fresult= f_mount (fs, &sciezka, 1); 功能甚至没有使用disk_initialize到达线.而且我得到了" fr_not_enabled"(f_mount-> find_volume ::::: FATFS图书馆的示例在FATFS网站上: http://elm-chan.org/fsw/fsw/ff/ff/ff/en/mount.html 请告诉我我应该怎么做. 解决方案 您的FAFT变量是无效的指针.使用本地变量.这样. FATFS fs; f_mount(&fs, "0:", 1)
4 2024-04-09
编程技术问答社区