MCU 真的可以进行并行处理吗?
假设我想倒计时,通过另一个接口发送数据,然后再做一项工作,例如同时点亮一个 LED。
这甚至可能吗?
我有按钮中断:
void EXTI0_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line0) != RESET){
if (/* BUTTON IS RELEASED */) {
/* do something */
}
if (/* BUTTON IS PRESSED */) {
/* do something else */
}
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
Run Code Online (Sandbox Code Playgroud)
有没有可能检查这个?
我尝试在 stm32f303 discovery 上运行 freertos。我包括从官方网站下载的 freertos 存档中的所有头文件和源文件。我还包括文件夹中的便携式文件/GCC/ARM_CM4F。我使用 codesourcery lite 编译器。当我尝试编译项目时出现错误:
In file included from freertos/inc/portable.h:321:0,
from freertos/inc/FreeRTOS.h:100,
from freertos/src/croutine.c:66:
freertos/inc/portmacro.h:167:7: error: missing binary operator before token "long"
Run Code Online (Sandbox Code Playgroud)
portmacro.h的 167-172 字符串:
#if( configMAX_PRIORITIES > 32 )
#error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice.
#endif …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用使用 USART 协议的 STM32 与 UART 协议设备进行通信。对于 USART,我只使用 tx 和 rx 引脚,这意味着它在异步模式下工作。我是 STM32 的新手,对 USART 和 UART 通信有点困惑。
我有一个STM32F302CBT6(运行在72MHz)项目,我需要测量4个信号的频率,每个信号约250kHz.信号连接到TIM1通道1-4.
现在,了解250kHz太快(或者是?)同时处理所有那些输入捕获中断(因为它们可能同步或同时发生......)我想逐个测量每个通道.我在程序开始时初始化了所有通道,并考虑在每个通道测量后逐个启用相应的中断.这是一个合适的想法还是我错过了什么?
问题是在为通道1提供第一个中断之后,下一个中断从未得到服务,因为虽然没有使能中断,但状态寄存器还有多个其他待处理中断(CCxIF和CCXOF,以及CxIF)以及设置的过捕获标志.我试图通过读取所有捕获值或设置TIMx-> SR = 0但没有帮助来避免此问题.
我将如何测量这些信号以及确保正确捕获每个通道的正确方法是什么?
我对此非常感兴趣,并希望了解如何进行这种处理或者如果你能指出我做错了什么.谢谢.
我目前的相关代码如下.
这是中断处理程序:
void TIM1_CC_IRQHandler(void) {
if (TIM_GetITStatus(IC_TIMER, IC_CH1) == SET) {
/* Clear TIM1 Capture compare interrupt pending bit */
TIM_ClearITPendingBit(IC_TIMER, IC_CH1);
//Read the capture value
raw_captures[capture_index] = TIM_GetCapture1(IC_TIMER);
capture_index++;
//Also read the others to avoid overcaptures
TIM_GetCapture2(IC_TIMER);
TIM_GetCapture3(IC_TIMER);
TIM_GetCapture4(IC_TIMER);
if(capture_index == 2) {
TIM_ITConfig(IC_TIMER, IC_CH1, DISABLE);
}
} else if (TIM_GetITStatus(IC_TIMER, IC_CH2 == SET)) {
TIM_ClearITPendingBit(IC_TIMER, IC_CH2);
//Read the capture value
raw_captures[capture_index] = TIM_GetCapture2(IC_TIMER);
capture_index++;
TIM_GetCapture1(IC_TIMER);
TIM_GetCapture3(IC_TIMER);
TIM_GetCapture4(IC_TIMER);
if(capture_index == 4) …Run Code Online (Sandbox Code Playgroud) 我想在芯片上的 SRAM 中存储一个简单的整数。(Cortex M4) 我用的程序是mbed online。我知道 SRAM 的地址从 0x2000 0000 开始,并且芯片有 4KB 的内存。
我已经阅读了数据表和位带部分,但这对我来说没有意义。
有人可以向我解释我如何在SRAM中存储例如数字5并再次读取它吗?
当前代码是这样的(c是一个整数,用户通过按钮改变):
if(c==100){
temp=c;
MBX_B0 = 1; // Word write
temp = MBX_B7; // Word read
TIMER_B0 = temp; // Byte write
return TIMER_B7; // Byte read
}
pc.printf("%d",temp);
它只是在 c==100 后停止运行 即使在断电后也应该保存该值。
我正在着手在 STM32(类似于 IAP AN4657)上开发自定义引导加载程序。假设flash分为3个区域scratch,user area,IAP code(bootloader)和待升级的固件都在scratch area。我想要一个带有固件版本和校验和的标头,我需要了解如何实现固件标头并从 IAP(引导加载程序)代码检查固件的有效性。对资源的任何参考表示赞赏。
我想了解以下功能模式定义的含义,库中有解释。但我不明白,因为解释很短而且不够。我在网上搜索我找不到任何有关的信息。
CAN_InitStructure.CAN_TTCM = DISABLE;
CAN_InitStructure.CAN_ABOM = DISABLE;
CAN_InitStructure.CAN_AWUM = DISABLE;
CAN_InitStructure.CAN_NART = ENABLE;
CAN_InitStructure.CAN_RFLM = DISABLE;
CAN_InitStructure.CAN_TXFP = ENABLE;
Run Code Online (Sandbox Code Playgroud) 我在 STM32CubeIDE 中有一个项目,我使用以下命令在无头模式下从命令行运行该项目:
headless-bat -project "my-project-name/Debug" -build
并且构建成功。但是,当我尝试将同一项目复制到另一个目录并尝试运行它时,我收到此错误警告:没有与我用它编写的项目名称匹配的项目。我将项目复制到 c:/myworkplace,然后运行以下命令:
headless-bat -project "my-project-name/Debug" -workplace "c:\myworkplace" -build
但我收到了上面提到的错误。有人有什么主意吗?
所以我可以读取温度的 ADC 值,并且当它达到太热值时我也会发送一个字符串。但我的问题是;它多次发送字符串。我想只发送一次。我试图通过使用延迟来修复它,但效果不佳。
if ( LM35_ADC_Value == 580 )
{
USART_puts(USART2,"VERY_HOT\n");
delay(1680000000000);
}
Run Code Online (Sandbox Code Playgroud)