我正在使用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
下面的图片是运行时期间发生的事情的示例.
我一直在测量皮质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) 我对STM32F7器件(STMicroelectronics的Cortex-M7微控制器)上的时钟系统感到困惑.参考手册没有充分说明这些时钟之间的差异:
参考手册在"5.2时钟>> "章节中读取."RCC通过AHB时钟(HCLK)除以8来提供Cortex系统定时器(SysTick)的外部时钟".
这个陈述与CubeMX的数字相矛盾.请注意,在CubeMX中,我可以选择从HCLK到'Cortex系统定时器'的预分频器.它不一定是8分.
我正在使用 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 时有效。
如果您知道解决方案,请告诉我。提前感谢您的回复。
我正在使用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) 我已将 UART 配置为以 DMA 模式接收,其中缓冲区的大小约为 64 字节。因此,基本上,HAL_UART_RxCpltCallback() DMA 接收完成中断仅在接收到 64 个字符时才会触发。
STM32中有没有一种方法可以为DMA Rx配置超时,当缓冲区仅部分填充(即接收到的字符少于64个)并且我们在指定的超时时间内不再接收到任何字符时,DMA将然后引发相同的基于 HAL_UART_RxCpltCallback() 的中断,让消费者使用 UART 当前接收到的任何部分数据?
我使用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_BUF并REGX从上图中。
REGX称为“活动寄存器”。REGX_BUF有时称为“缓冲寄存器”。其他术语是“预加载寄存器”和“影子寄存器(?)”。
混乱解释了。
不幸的是,术语“影子寄存器”存在混淆。根据我从互联网上获得的一些资料,它指的是REGX_BUF。但是在STM32F746微控制器的参考手册RM0385和STM32F767微控制器的RM0410中,我偶然发现了与“影子寄存器”一词完全相反的解释。它不是指 …
我有 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)
我发现如果两个任务具有相同的任务优先级,则这两个任务可以正常工作,但是如果它们的任务优先级不同,则低任务不起作用。
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)
如果两个任务的堆栈大小加起来大于 3 KB,则确认任务未正常工作。下面的代码工作正常。
xTaskCreate(led1_task, …Run Code Online (Sandbox Code Playgroud) 这个问题相当笼统,因为我还没有开始编码,只是想知道是否有可能用 lwIP 实现我想要的。
我想要的是让我的嵌入式 STM32F769I-Disco 板调用网站 URL API,例如http://test.com/items/1,它返回 JSON,然后我想解析它。
由于 lwIP 实现了 TCP/IP 堆栈,这在理论上应该是可能的,还是我错了?
我还没有真正找到任何可以做到这一点的例子,或者我什至不知道如何搜索它。任何有用的指针?
问题也是,我是否应该使用套接字连接而不是尝试调用 API url?如果我决定使用 nanopb 之类的东西,我还需要 lwIP,还是可以不用它?