维基百科说:
弱符号表示在链接可执行和可链接格式 (ELF) 目标文件期间的特殊注释符号。默认情况下,没有任何注释,目标文件中的符号是强符号。在链接期间,强符号可以覆盖同名的弱符号。相比之下,共享名称的两个强符号在链接时会产生链接错误。链接二进制可执行文件时,弱声明的符号不需要定义。相比之下,(默认情况下)没有定义的声明强符号会触发未定义符号链接错误。C或C++语言标准没有提到弱符号;因此,将它们插入代码不是很便携。即使两个平台支持将符号标记为弱的相同或相似的语法,语义也可能在细微之处有所不同,例如
什么是弱函数,它们的用途是什么?我正在使用 stm32f429 微控制器。库中有一些弱函数。但我无法理解,它们是什么以及它们的用途!
我在谷歌上搜索了它,但没有得到满意的答案。
我有一块NUCLEO-F401RE 板(带有STM32F401RE),它在大部分情况下工作正常。最近,我按照“ Mastering STM32 ”一书中的教程进行操作,其中提到安装OpenOCD。
在此之前我也一直在关注,并且我能够连接到我的开发板并刷新它,没有任何问题。
但在尝试让 OpenOCD 工作后,这不再可能了。每次我尝试连接到我的开发板时,我都会收到以下错误消息:
未检测到 ST-LINK
我已经尝试多次更新驱动程序、重新启动开发板、重新安装ST-LINK实用程序、切换 USB 电缆、重置开发板并重新安装所有内容,并且我还尝试了按住重置按钮并尝试擦除芯片。不幸的是,到目前为止,这些都对我不起作用。
这是我的主板的图片:
在我的桌面上,我使用 Windows 10。在我的主板上,我使用FreeRTOS。
[
我也尝试过使用 ST-LINK 升级来更新我的主板上的固件,但没有成功。尝试此操作时,我要么无法选择我的设备(使用.jar应用程序时),要么在使用.exe应用程序时,我只收到以下错误消息:
未检测到 ST-Link 设备
请连接并重试
有解决办法吗?
我想写一个变量,例如一个数字为5的整数到FLASH,然后在电源消失后再次打开设备读取它.
我已经知道为了写东西我首先需要擦除页面然后写.
在手册中它说:
- 在Flash选项密钥寄存器(FLASH_OPTKEYR)中写入OPTKEY1 = 0x0819 2A3B
- 在Flash选项密钥寄存器(FLASH_OPTKEYR)中写入OPTKEY2 = 0x4C5D 6E7F
我该如何执行此任务?
扇区0的块地址从0x0800 0000到0x0800 3FFF,这是我想写的地方.
这里是手册的链接,第71页:STM32手册
我花了几天时间试图理解,但我被卡住了.在我的STM32F429I-DISC1板上输入'bootm 8100000'后,我得到的只是一个"Starting kernel ..."消息.
在我从2011年到2016年更新uboot之前这是一个"起始内核......"+ UNHANDED EXCEPTION HARDFAULT,但现在我只有"Starting Kernel ..."消息.
MCU是一个stm32F429,2MB Flash + ext.8MB RAM.
Flash start addr是0x08000000(uboot addr),我把我的内核放在第二个闪存库的开头0x08100000.
外部8MB RAM的启动是0xD0000000
u-boot-2016.11似乎在那块板上跑得很好,bdi给我:
U-Boot > bdi
arch_number = 0x00000000
boot_params = 0xD0000100
DRAM bank   = 0x00000000
-> start    = 0xD0000000
-> size     = 0x00800000
current eth = unknown
ip_addr     = <NULL>
baudrate    = 115200 bps
relocaddr   = 0xD07D6000
reloc off   = 0xC87D6000
irq_sp      = 0xD05D3EE0
sp start    = 0xD05D3ED0
Early malloc usage: e0 / 400
这就是我构建内核的方式: …
我正在使用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(); …我已将 UART 配置为以 DMA 模式接收,其中缓冲区的大小约为 64 字节。因此,基本上,HAL_UART_RxCpltCallback() DMA 接收完成中断仅在接收到 64 个字符时才会触发。
STM32中有没有一种方法可以为DMA Rx配置超时,当缓冲区仅部分填充(即接收到的字符少于64个)并且我们在指定的超时时间内不再接收到任何字符时,DMA将然后引发相同的基于 HAL_UART_RxCpltCallback() 的中断,让消费者使用 UART 当前接收到的任何部分数据?
我想从我的用户代码写入 STM32F407VGT 的闪存扇区 11 以存储一些数据。我用过stm32f4xx_hal_flash.c图书馆。我首先使用以下代码擦除扇区:
void Flash_Init(void)
{        
    FLASH_EraseInitTypeDef pEraseInit;
    pEraseInit.Banks = FLASH_BANK_1;
    pEraseInit.NbSectors = 1;
    pEraseInit.Sector = FLASH_SECTOR_10;
    pEraseInit.VoltageRange = FLASH_VOLTAGE_RANGE_3;
    pEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS;
    if(HAL_FLASH_Unlock() == HAL_OK)
    {
        __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR );
        HAL_FLASHEx_Erase(&pEraseInit,0);
        HAL_FLASH_Lock();
    }
}
程序在到达HAL_FLASHEx_Erase(&pEraseInit,0);函数时挂起。我的分散文件如下所示:
LR_IROM1 0x08000000 0x01000000  {    ; load region size_region
  ER_IROM1 0x08000000 0x01000000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00020000  {  ; RW data …我试图了解如何在定制 PCB 上将 TFT 屏幕模块与 STM32F4 芯片连接起来。 这是模块及其基本信息。
为了将命令和数据写入屏幕,屏幕模块上的 ILI9481 驱动程序使用显示总线接口 (DBI),其中数据通过数据线发送 8 位或 16 位。
查看库示例,我明白(如果我错了,请纠正我),为了发送一个字节的命令,它只是根据命令将芯片的数字引脚设置为高电平或低电平。例如,8 位通信中的命令 0x2 将是 00000010,其中 0 将是芯片 GPIO 引脚上的数字低电平,1 将是数字高电平,这意味着 8 条线中的 1 条处于活动状态(逻辑高)。我希望,我理解正确。
现在,当我查看示例时,通常这些数字引脚位于同一个 GPIO 端口上。如果我理解正确的话,GPIO 端口有一个寄存器,称为 BSRR,您可以在其中操作 GPIO 端口引脚的逻辑电平。如果数据引脚都在同一个 GPIO 端口上,我认为这会起作用(从示例中,其中 c 是命令字节):
void STM32_TFT_8bit::write8(uint8_t c) {
  // BRR or BSRR avoid read, mask write cycle time
  // BSRR is 32 bits wide. 1's in the most significant 16 bits signify pins to reset (clear)
  // 1's in least significant …我正在使用 STM32F4,我想生成一个软件中断。问题是我如何在中断处理程序中知道中断是由软件还是由连接到 EXTI 线的引脚产生的?
试图为 STM32F4 UART 推出我自己的代码。该芯片的一个特点是,如果您像 GNAT 编译器那样使用字节寻址来设置单个位,则半字的另一个字节中的相应位将被设置。数据表说使用半字寻址。有没有办法告诉编译器这样做?我试过 CR1_register'Size use 16;
但这没有效果。写入整个 16 位字有效,但您无法设置命名位。