标签: stm32f7

STM32 - 如何启用DWT循环计数器

我正在使用STM32F7-Discovery板,并且一直试图启用DWT循环计数器.从我在网上看到的,这应该足以启用它:

CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->CYCCNT = 0;
DWT->CTRL |= 1;
Run Code Online (Sandbox Code Playgroud)

但是,当我运行该代码时,不会更改值或跳过操作(我不太确定发生了什么).

我已经尝试过指向内存中的地址并直接修改它们,但也无济于事.例如:

volatile uint32_t *DWT_CONTROL = (uint32_t *) 0xE0001000;
volatile uint32_t *DWT_CYCCNT = (uint32_t *) 0xE0001004;
volatile uint32_t *DEMCR = (uint32_t *) 0xE000EDFC;
*DEMCR = *DEMCR | 0x01000000;
*DWT_CYCCNT = 0;
*DWT_CONTROL = *DWT_CONTROL | 1;
Run Code Online (Sandbox Code Playgroud)

目前,我获得的唯一方法是在Visual Studio中使用调试器(使用VisualGDB)时,如果我将DWT-> CTRL的值更改为ON值,则循环计数器开始.除此之外,我似乎无法获得改变代码的价值.

编辑:可能导致这些代码行没有执行任务但也没有崩溃和继续的行为.

CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->CYCCNT = 0;
DWT->CTRL |= 1;
Run Code Online (Sandbox Code Playgroud)

在运行这些代码行之后,这些内存位置的所有值都保持不变,并且不会随着应该执行的操作而改变.

EG:

//DWT_CTRL_CYCCNTENA_Msk = 1
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk 
Run Code Online (Sandbox Code Playgroud)

应该导致DWT-> CTRL的值为0x40000001,但它保持默认值0x40000000

下面的图片是运行时期间发生的事情的示例.

之前 之后

c embedded arm stm32f7

10
推荐指数
3
解决办法
1万
查看次数

测量皮质m7上的时钟周期计数

我一直在测量皮质m4上的时钟周期计数,现在想在皮层m7上做.我使用的主板是STM32F746ZG.

对于m4,一切顺利:

volatile unsigned int *DWT_CYCCNT;
volatile unsigned int *DWT_CONTROL;
volatile unsigned int *SCB_DEMCR;

void reset_cnt(){
    DWT_CYCCNT   = (volatile unsigned int *)0xE0001004; //address of the register
    DWT_CONTROL  = (volatile unsigned int *)0xE0001000; //address of the register
    SCB_DEMCR    = (volatile unsigned int *)0xE000EDFC; //address of the register
    *SCB_DEMCR   = *SCB_DEMCR | 0x01000000;
    *DWT_CYCCNT  = 0; // reset the counter
    *DWT_CONTROL = 0; 
}

void start_cnt(){
    *DWT_CONTROL = *DWT_CONTROL | 0x00000001 ; // enable the counter
}

void stop_cnt(){
     *DWT_CONTROL = *DWT_CONTROL …
Run Code Online (Sandbox Code Playgroud)

c embedded arm stm32f7

8
推荐指数
1
解决办法
1751
查看次数

STM32内部时钟

我对STM32F7器件(STMicroelectronics的Cortex-M7微控制器)上的时钟系统感到困惑.参考手册没有充分说明这些时钟之间的差异:

  • SYSCLK
  • HCLK
  • FCLK

参考手册在"5.2时钟>> "章节中读取."RCC通过AHB时钟(HCLK)除以8来提供Cortex系统定时器(SysTick)的外部时钟".
这个陈述与CubeMX的数字相矛盾.请注意,在CubeMX中,我可以选择从HCLK到'Cortex系统定时器'的预分频器.它不一定是8分.

在此输入图像描述

arm clock stm32 cortex-m stm32f7

7
推荐指数
1
解决办法
4394
查看次数

如何更改闪存的起始地址?

我正在使用 STM32F746ZG 和 FreeRTOS。flash 的起始地址是 0x08000000。但我想把它改成 0x08040000。我已经通过谷歌搜索了这个问题,但没有找到解决方案。

我更改了链接器脚本,如下所示。

MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 320K
/* FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 1024K */
FLASH (rx)      : ORIGIN = 0x8040000, LENGTH = 768K
}
Run Code Online (Sandbox Code Playgroud)

如果我只更改它并运行调试器,就会出现问题。如果我将 VECT_TAB_OFFSET 从 0x00 更改为 0x4000,它工作正常。

/* #define VECT_TAB_SRAM */
#define VECT_TAB_OFFSET  0x40000  /* 0x00 */

SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; 
Run Code Online (Sandbox Code Playgroud)

但是如果我不使用调试器,它就不起作用。这意味着它仅在使用 ST-Linker 时有效。

如果您知道解决方案,请告诉我。提前感谢您的回复。

stm32 stm32f4discovery stm32f7 stm32f0

6
推荐指数
1
解决办法
6551
查看次数

在STM32板上运行后如何更改UART波特率?

我正在使用STM32F746ZG并使用五个UARTs. All UARTs工作正常。有人可以告诉我在USART初始化后更改波特率的程序吗?我正在使用USART6和初始化9600波特率。开机后,没有任何通讯USART。我想将波特率从9600 to 57600 or 115200. 对于这个改变,我打了电话HAL_UART_DeInit()MX_USART6_UART_Init_57600()但它不起作用。如果我没有改变波特率,它工作正常。但是如果我改变了波特率,我无法通过以下方式接收数据USART. 如果有人知道解决方案,请告诉我。

以下是我的代码。

int main(void)
{
  HAL_Init();

  SystemClock_Config();


  MX_UART7_Init();
  MX_UART8_Init();
  MX_USART2_UART_Init();
  MX_USART3_UART_Init();
  MX_USART6_UART_Init();

}

void MX_USART6_UART_Init(void)
{
  huart6.Instance = USART6;
  huart6.Init.BaudRate = 9600;
  huart6.Init.WordLength = UART_WORDLENGTH_8B;
  huart6.Init.StopBits = UART_STOPBITS_1;
  huart6.Init.Parity = UART_PARITY_NONE;
  huart6.Init.Mode = UART_MODE_TX_RX;
  huart6.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart6.Init.OverSampling = UART_OVERSAMPLING_16;
  huart6.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart6.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart6) != HAL_OK)
  {
    Error_Handler(); …
Run Code Online (Sandbox Code Playgroud)

stm32 stm32f4discovery stm32f4 stm32f7

6
推荐指数
1
解决办法
4671
查看次数

指定超时后有意接收完成 UART DMA 中断

我已将 UART 配置为以 DMA 模式接收,其中缓冲区的大小约为 64 字节。因此,基本上,HAL_UART_RxCpltCallback() DMA 接收完成中断仅在接收到 64 个字符时才会触发。

STM32中有没有一种方法可以为DMA Rx配置超时,当缓冲区仅部分填充(即接收到的字符少于64个)并且我们在指定的超时时间内不再接收到任何字符时,DMA将然后引发相同的基于 HAL_UART_RxCpltCallback() 的中断,让消费者使用 UART 当前接收到的任何部分数据?

stm32 dma stm32f4 stm32f7

5
推荐指数
1
解决办法
3446
查看次数

STMicro是否会错误地解释“影子寄存器”一词?

我使用STM32系列微控制器,更具体地说是该STM32F7系列。目前,我正在研究通用计时器的使用。

关于双缓冲寄存器。

微控制器有时会使用双缓冲寄存器。这样,软件就可以在不引起麻烦的情况下写入和读取寄存器。下图说明:

              buffered register:           active register:
                 --------------             --------------
                |   REGX_BUF   | <-------> |    REGX      |
                 --------------             --------------
                      |                           |
                      |                           |
                   SOFTWARE                    HARDWARE

         The software interacts        Updates to and from the
         only with the buffered        active register take place
         register.                     at specific moments (when it
                                       is 'safe').

         synonyms:                     synonyms:
           - buffered register            - active register
           - preload register
           - shadow register (?)
Run Code Online (Sandbox Code Playgroud)

有几个方面两者REGX_BUFREGX从上图中。

  • 通常,寄存器REGX称为“活动寄存器”。
  • 寄存器REGX_BUF有时称为“缓冲寄存器”。其他术语是“预加载寄存器”和“影子寄存器(?)”。

混乱解释了。

不幸的是,术语“影子寄存器”存在混淆。根据我从互联网上获得的一些资料,它指的是REGX_BUF。但是在STM32F746微控制器的参考手册RM0385和STM32F767微控制器的RM0410中,我偶然发现了与“影子寄存器”一词完全相反的解释。它不是指 …

microcontroller stm32 stm32f7 nucleo

3
推荐指数
1
解决办法
499
查看次数

FreeRTOS 任务优先级和堆栈大小

我有 STM32F746ZG Nucleo-144pin 板并使用 STMCubeMx 生成代码。我选择了 CubeMx 提供的 10.0.0 版本的 FreeRTOS,工具链是 SW4STM32。

我做了两个任务,以下是我的功能。我的代码在这里:

void led1_task(void)
{
    while(1)
    {
        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);
        HAL_Delay(1000);
    }
}

void led2_task(void)
{
    while(1)
    {
        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_14);
        HAL_Delay(4100);
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 任务优先。

我发现如果两个任务具有相同的任务优先级,则这两个任务可以正常工作,但是如果它们的任务优先级不同,则低任务不起作用。

  xTaskCreate(led1_task, "led1_task", 1024, NULL, 2, NULL);  ==> Works fine.
  xTaskCreate(led2_task, "led2_task", 1024, NULL, 2, NULL);  ==> Works fine.

----------------------------------------------------------------------------

  xTaskCreate(led1_task, "led1_task", 1024, NULL, 2, NULL);  ==> This task is not working.
  xTaskCreate(led2_task, "led2_task", 1024, NULL, 3, NULL);  ==> Works fine.

Run Code Online (Sandbox Code Playgroud)
  1. 任务堆栈大小。

如果两个任务的堆栈大小加起来大于 3 KB,则确认任务未正常工作。下面的代码工作正常。

  xTaskCreate(led1_task, …
Run Code Online (Sandbox Code Playgroud)

stm32 freertos stm32f7 cubemx stm32cubemx

2
推荐指数
1
解决办法
3118
查看次数

lwIP 调用远程服务器 API

这个问题相当笼统,因为我还没有开始编码,只是想知道是否有可能用 lwIP 实现我想要的。

我想要的是让我的嵌入式 STM32F769I-Disco 板调用网站 URL API,例如http://test.com/items/1,它返回 JSON,然后我想解析它。

由于 lwIP 实现了 TCP/IP 堆栈,这在理论上应该是可能的,还是我错了?

我还没有真正找到任何可以做到这一点的例子,或者我什至不知道如何搜索它。任何有用的指针?

问题也是,我是否应该使用套接字连接而不是尝试调用 API url?如果我决定使用 nanopb 之类的东西,我还需要 lwIP,还是可以不用它?

embedded stm32 lwip stm32f7

1
推荐指数
1
解决办法
2008
查看次数