我正在使用 STM32CubeMX 为 STM32F103 微控制器创建一个空白项目。使用 HAL 驱动程序(默认),我得到了一个快速运行的闪烁示例,但我想尝试使用 LL(低级)驱动程序而不是 HAL。
当我转到 CubeMX 中的项目 > 设置 > 高级设置时,我看到列出的外围设备,并且每个外围设备旁边都有一个下拉菜单,其中只有一个选项,HAL。根据文档,这是我可以为每个外围设备选择 LL 或 HAL 的地方。
如何在 STM32CubeMX 中启用 LL 驱动程序?
详细信息:我在 Ubuntu (16.04) 上全新安装了 STM32CubeMX (4.23.0) 并为 STM32F103C8 微控制器创建了一个新项目(这是在“Blue Pill”板上)。我正在使用 SW4STM32 IDE,除了我必须在配置文件中选择 STLink V2 而不是 V2.1 之外,一切都或多或少都是开箱即用的。
我想使用 Nucleo STM32F103RB 在 master 中将 NSS 引脚设置为软件模式。但我有一些问题?
在参考手册中,他们说,
在 NSS 软件模式下,设置 SPI_CR1 寄存器中的 SSM 和 SSI 位。如果在输出模式下需要 NSS 引脚,则只应设置 SSOE 位。
现在,
为什么我们需要用 SSM 设置 SSI 位?
SSOE 位的目的是什么?
我正在试灯STM32F103C8T6上的LED指示灯(在端口c,针脚13上)。我没有使用IDE。码:
#include "include/stm32f10x.h"
int main()
{
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
GPIOC->CRH &= ~GPIO_CRH_CNF13;
GPIOC->CRH |= GPIO_CRH_MODE13_0;
GPIOC->BSRR = GPIO_BSRR_BR13;
while(1)
{
GPIOC->BSRR = GPIO_BSRR_BS13;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在包含目录中包含文件的链接:
我就是这样编译的
arm-none-eabi-gcc --specs=nosys.specs -o output led.c
将其上传到mc后,什么也没有发生。
所以我使用的是 STM32F103C8T6 板,几天前它工作正常,但后来尝试使用 keil 视觉编译器加载代码,它显示此消息 STLINK Error(DEV_TARGET_HELD_UNDER_RESET)。之后使用STM32CubeProgrammer也显示同样的问题,仅与“热插拔”模式连接, 如您在此处看到的
它显然是一个重置错误,但我真的不知道它是如何发生的,并且在互联网上找不到太多有关此问题的资源,现在我无法在我的 stm32f103 板上下载任何代码,它显示 此消息
在网上研究后发现可能是焊接问题,但我不认为是这样,我只使用微控制器,而不是任何面包板电路,几天前就完全没问题了。我的所有写入和读取保护复选框在 STM32CubeProgrammer 部分中也未选中。
我在 stcommunity 上的家伙刚刚说“他检查了所有 CPU 引脚,主板开始工作。” 但这是引脚重置的问题吗?在STM32F103C8T6板中,它有一个重置按钮,但如何查找其中的问题?
所以我STM32F103C8T6用C语言编写了一个微控制器程序,使用RTC(实时时钟)和显示模块.
RTC和显示都工作正常,但是当我尝试从RTC中断处理程序内部更新显示时,它不起作用.
当我从内部向显示器写东西时main(),它工作得很好.
中断处理程序也可以工作,所以我认为问题在写入显示的函数中.
此功能使用小延迟来与显示控制器进行通信.
我以前使用SysTick过来生成这样的延迟:
void delay(uint32_t n){
uint32_t start = systick_count;
while (systick_count - start < n);
return;
}
Run Code Online (Sandbox Code Playgroud)
但不知何故,在RTC的中断处理程序中,它不起作用.所以我用这个替换了我的延迟函数,而不是使用SysTick:
for (; i>0; i--) {
for (int j = 0; j < 72; ++j) {
__asm__ __volatile__("nop\n\t":::"memory");
}
}
Run Code Online (Sandbox Code Playgroud)
现在一切正常.
我试图理解,为什么SysTick显然在RTC中断处理程序内不起作用.
我想这可能是由中断优先级引起的,但根据数据表,默认情况下,SysTick Interrupt优先级高于RTC中断优先级.
也许有人可以解释,为什么会这样?
编辑1:好的,所以我已经阅读了更多关于中断优先级的内容,似乎我需要正确配置NVIC_IRQChannelPreemptionPriority.我会尽快尝试这个...
关于中断内部的延迟,我知道这不是正确的方法,但我仍然想了解程序的行为
EDIT2:我刚刚尝试通过以下方式更改中断优先级:
// set RTC interrupt priority to 15 (lowest)
NVIC_SetPriority(RTC_IRQn, 15);
// set interrupt priority of SysTick to 0 (highest)
NVIC_SetPriority(SysTick_IRQn, 0); …Run Code Online (Sandbox Code Playgroud)