- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
STM32 App Note 2606 对此进行了讨论,但没有简单的代码示例。
最佳答案
此答案已使用 IAR EWARM 在 STM32F072 Nucleo 板上进行测试。该答案仅使用“STM32 标准外设库”。
请注意,验证您是否成功进入引导加载程序模式(DFU 模式)的最佳/最简单方法是在 PA_9 行(USART1_TX)上连接一个 USB-2-UART 转换器(从 Sparkfun 获得一个:http://sfe.io/p9873 15 美元) ) 和 PA_10 (USART1_RX)(不要忘记也接地)。我无法使用 Nucleo USART2 默认连接 (/dev/ttyACM0),因此无法使用外部 USB-2-USART 连接。然后创建一个简单的 C 程序在 USART 连接上写入 0x7F。如果你处于 DFU 模式,它会回复一个字节:0x79。我使用 Ubuntu,所以我的测试程序在 Linux 上编译和运行。
此外,测试引导加载程序模式(也称为 DFU 模式)的最简单方法是将 BOOT0 线跳接到 +3.3V。它们在 Nucleo 上紧挨着。
添加到 main.c main() 例程:
// Our STM32 F072 has:
// 16k SRAM in address 0x2000 0000 - 0x2000 3FFF
*((unsigned long *)0x20003FF0) = 0xDEADBEEF;
// Reset the processor
NVIC_SystemReset();
在Libraries/sysconfig/system_stm32f0xx.c的SystemInit()函数的开头添加一些代码:
// Define our function pointer
void (*SysMemBootJump)(void);
void SystemInit (void)
{
// Check if we should go into bootloader mode.
//
// Set the main stack pointer __set_MSP() to its default value. The default
// value of the main stack pointer is found by looking at the default value
// in the System Memory start address. Do this in IAR View -> Memory. I
// tried this and it showed address: 0x200014A8 which I then tried here.
// The IAR compiler complained that it was out of range. After some
// research, I found the following from "The STM32 Cortex-M0 Programming
// Manual":
// Main Stack Pointer (MSP)(reset value). On reset, the processor
// loads the MSP with the value from address 0x00000000.
//
// So I then looked at the default value at address 0x0 and it was 0x20002250
//
// Note that 0x1fffC800 is "System Memory" start address for STM32 F0xx
//
if ( *((unsigned long *)0x20003FF0) == 0xDEADBEEF ) {
*((unsigned long *)0x20003FF0) = 0xCAFEFEED; // Reset our trigger
__set_MSP(0x20002250);
// 0x1fffC800 is "System Memory" start address for STM32 F0xx
SysMemBootJump = (void (*)(void)) (*((uint32_t *) 0x1fffC804)); // Point the PC to the System Memory reset vector (+4)
SysMemBootJump();
while (1);
}
... // The rest of the vanilla SystemInit() function
创建一个简单的实用程序来查看您是否处于引导加载程序模式(也称为 DFU 模式)。这在 Linux 上编译和运行。确保你的串口正确。它可能是/dev/ttyUSB0,如下所示。
//
// A bare-bones utility: Test if the STM32 is in DFU mode
// (aka bootloader mode, aka firmware update mode).
//
// If it is in DFU mode, you can send it 0x7F over a UART port and it
// will send 0x79 back.
//
// For details, see the STM32 DFU USART spec.
//
#include <termios.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
#include <errno.h> // errno
#define DEFAULT_SERDEVICE "/dev/ttyUSB0"
//#define DEFAULT_SERDEVICE "/dev/ttyACM0"
int main(int argc, char **argv)
{
int fd, cooked_baud = B9600;
char *sername = DEFAULT_SERDEVICE;
struct termios oldsertio, newsertio;
unsigned char mydata[2] = {0};
mydata[0] = 0x7F;
mydata[1] = 0;
/* Not a controlling tty: CTRL-C shouldn't kill us. */
fd = open(sername, O_RDWR | O_NOCTTY);
if ( fd < 0 )
{
perror(sername);
exit(-1);
}
tcgetattr(fd, &oldsertio); /* save current modem settings */
/*
* 8 data, EVEN PARITY, 1 stop bit. Ignore modem control lines. Enable
* receive. Set appropriate baud rate. NO HARDWARE FLOW CONTROL!
*/
newsertio.c_cflag = cooked_baud | CS8 | CLOCAL | CREAD | PARENB;
/* Raw input. Ignore errors and breaks. */
newsertio.c_iflag = IGNBRK | IGNPAR;
/* Raw output. */
newsertio.c_oflag = OPOST;
/* No echo and no signals. */
newsertio.c_lflag = 0;
/* blocking read until 1 char arrives */
newsertio.c_cc[VMIN]=1;
newsertio.c_cc[VTIME]=0;
/* now clean the modem line and activate the settings for modem */
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newsertio);
// Here is where the magic happens
write(fd,&mydata[0],1);
int red = read(fd,&mydata[1],1);
if (red < 0) {
fprintf(stderr, "Error: read() failed, errno [%d], strerrer [%s]\n",
errno, strerror(errno));
}
tcsetattr(fd,TCSANOW,&oldsertio);
close(fd);
printf("Read [%d] bytes: [0x%x]\n", red, mydata[1]);
return 0;
}
关于bootloader - 在STM32 F072上如何跳转到软件中的bootloader(DFU模式)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28288453/
我想知道引导加载程序在哪些硬件上运行?它是在 RAM 上运行,还是在主板的处理器上运行,如果它不在处理器上运行,那么在加载操作系统时处理器的用途是什么,例如将操作系统的内核加载到处理器中(如果它是'就
我将编写并测试一个引导加载程序。为了做到这一点,我计划将引导加载程序复制到软盘镜像文件并将其安装在 VM 中。 但是,我不确定将引导加载程序的机器代码放在哪里。它是否只是转储到文件的前几个字节中? 最
我需要在 grub2 命令提示符下挂载 VHD 文件。 我尝试使用“loopback”命令,如下所示: grub > insmod ntfs grub > insmod ntldr grub > lo
引导加载程序与引导加载程序有何不同。根据我的说法,引导加载程序存储在 ROM 中,引导加载程序存储在硬盘的 MBR 中(如果我错了,请纠正我)。 bootstrap loader是启动后第一个执行的程
我有以下 U-Boot 环境变量: nas220> printenv autoload=no autostart=no baudrate=115200 bootargs=console=ttyS0,1
我正在考虑开发一个简单的(开始)UEFI 引导加载程序来加载 ELF 镜像,并且想知道是否有人可以很好地进入任何现有项目,或者我可以用来开始的示例和。 此外,我想知道是否有人有任何让 virtual
我目前正在修复我为加载自定义实模式 x86 内核 (SYS.BIN) 而编写的引导加载程序。我设法让它读取根目录和 FAT,并从文件系统加载一个小型内核,所有这些都在引导扇区内。但是,我开始用更大的内
终于, Spark 板边缘板今天到了;-) 遵循这个写得很好的指南:https://codelabs.developers.google.com/codelabs/sparkfun-tensorflo
STM32 App Note 2606 对此进行了讨论,但没有简单的代码示例。 最佳答案 此答案已使用 IAR EWARM 在 STM32F072 Nucleo 板上进行测试。该答案仅使用“STM32
我已经为位于扇区 0 的 SAM4S 编写了一个引导加载程序,并在扇区 1 加载了一个应用程序。然而问题是,当我尝试跳转到新函数时,它似乎生成了一个异常(调试器转到 Dummy_Handler ())
这个主要是在facebook的源码中看到的 Bootloader.setResourceMap({"bMxb7":{"name":.... javascript中的bootloader到底是什么?有什
我终于了解了汇编和裸机编程的基础知识。或者至少这是我的想法。这是我写的(我自己第一次:)) [BITS 16] [ORG 0X7C00] Yaz: MOV SI, Msa MOV AL, [SI
我查了很多关于这个问题的资料,但还没有找到明确的答案。如您所知,AVR 微 Controller Atmega128有一个Flash存储器,可分为引导加载程序和应用程序存储器。我已经调整了每一项的参数
我发现我的 android 图像存在问题,命令 adb reboot bootloader 只是重新启动 android,而不是进入引导加载程序模式。 为了解决这个问题,我做了一些研究,发现实际上有两
我尝试创建一个打印“hello world”的简单引导加载程序。 当我调用一个只打印“hello world”的函数时我可以做到这一点,但是当我调用一个函数来打印特定字符串时,什么也没有发生。 为此,
我在通过 Java Webstart 运行 Java RCP 应用程序时遇到问题。 这适用于团队中的其他人,但不适用于我。 (你不就是喜欢这类问题吗) 我认为问题在于它正在下载 32 位版本的应用程序
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。 关闭
我找到了这个网站:http://www.os-forum.com/minix/boot/ 声称记录了Minix的启动顺序。 但是在我从Git获得的Minix 3.2的源代码树中,上述站点中描述的文件根
引导加载程序无论如何都会在该地址加载它?为什么要在程序中指定这个? 最佳答案 ORG 伪指令的作用是告诉汇编器将此偏移量添加到提到的所有绝对地址。例如,如果您编写“MOV AX,my_string”并
我是这些设备的新手,即使它们很便宜,我也不想不必要地把它们弄成砖头。 我使用 esptool 将 NodeMCU 固件刷写到我的模块上。这样做时,我需要指定写入文件的地址,通常是 0x00000。这是
我是一名优秀的程序员,十分优秀!