Tag: stm32

STM32上的ADC单次转换

我正在研究STM32 F103x上的ADC编程,从最简单的情况开始 – 单次转换。 测量内部温度传感器(连接到ADC1)的值,并使用USART将其发送到COM端口。 目标似乎很清楚但是当我尝试将源代码下载到闪存时,它不会向COM端口发送任何数据。 USARTfunction运行良好,我猜这些问题来自ADC配置部分,因为我正处于等待完全转换的循环中: while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); //Wail for conversion complete 这是我到目前为止的源代码。 /* Includes ————————————————————*/ #include “stm32f10x.h” #include uint16_t AD_value; const uint16_t V25 = 1750; //when V25=1.41V const uint16_t Avg_Slope = 5; //when avg_slc uint16_t TemperatureC; //Define output device PUTCHAR_PROTOTYPE { USART_SendData(USART1, (uint8_t) ch); while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} return […]

STM32L0的自动波特率检测

我无法在STM32L0上进行自动波特率检测。 我正在使用硬件抽象层(HAL)。 我的初始化代码是: /* USART1 init function */ void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 300; huart1.Init.WordLength = UART_WORDLENGTH_9B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_EVEN; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; huart1.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED; huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_AUTOBAUDRATE_INIT; huart1.AdvancedInit.AutoBaudRateEnable = UART_ADVFEATURE_AUTOBAUDRATE_ENABLE; huart1.AdvancedInit.AutoBaudRateMode = UART_ADVFEATURE_AUTOBAUDRATE_ONSTARTBIT; HAL_UART_Init(&huart1); } 我通过UART1发送的字节是: 0 1 2 3 4 […]

在contiki程序中使用malloc

考虑以下contiki计划。 #include #include”contiki.h” #include static char *mem; static int x; /*—————————————————————————*/ PROCESS(test, “test”); AUTOSTART_PROCESSES(&test); /*—————————————————————————*/ PROCESS_THREAD(test, ev, data) { PROCESS_BEGIN(); printf(“before malloc\n”); mem=(char*)malloc(10); for(x=0;x<10;x++) mem[x]=x+1; printf("after malloc\n"); PROCESS_END(); } 当这个程序编译为native / z1 / wismote / cooja时,它执行得很好并且两个printf语句都被执行,但是当编译为mbxxx目标,然后在硬件上执行时,只执行第一个printf语句并且代码被卡住了在malloc。 这种行为背后的任何猜测或原因? 我也在这里附加GDB跟踪。 (gdb) mon reset init target state: halted target halted due to debug-request, current mode: Thread xPSR: 0x01000000 […]

擦除后无法写入闪存

所以擦除后我不能直接写入内部闪存。 如果在写操作之前没有擦除操作,那么我可以。 任何想法为什么? 编程function返回“成功写入”值,但在查看内存时,不会写入任何数据。 这是代码: uint32_t pageAddress = 0x08008000; uint16_t buffer = 0xAAAA; HAL_FLASH_Unlock(); FLASH_PageErase(pageAddress); HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, pageAddress, buffer); HAL_FLASH_Lock(); 我已经尝试在擦除和编程之间锁定内存,在这些操作之间造成延迟,这无济于事。

GCC – 如何阻止malloc被链接?

我正在努力将我的代码缩小到最小的裸骨大小! 我使用的STM32F0只有32k闪存,需要大部分闪存用于数据存储。 我的代码已经有大约20k的闪存大小! 其中一些原因是由于使用了STM32 HALfunction,我可以根据需要对其进行解释和优化。 但是,我最大的flash消费者是所有隐含的库例程。 我似乎无法删除这些function。 它们不会在我的代码或任何HAL代码中的任何位置调用。 诸如_malloc_r(1.3k字节)和__vfiprintf_r(3kB)以及许多其他function正在使用我的闪存的很大一部分。 我认为这些都是libc函数。 我不使用这些并希望它们消失! 有谁知道如何删除这些? 我尝试了不同的优化级别和链接器选项但到目前为止没有运气。 我试过-nostdlib和–specs = nosys.specs没有变化。 如果我删除我的文件与_exit等函数的定义我得到一个链接器错误,表明该库仍然包含在内,需要这些。 链接器映射也确认存在许多不需要的function! 有什么建议?

如何在Cortex-M3(STM32)上从RAM执行function?

我正在尝试从Cortex-M3处理器(STM32)上的RAM执行一个函数。 该function擦除并重写内部闪存,所以我肯定需要在RAM中,但我该怎么做? 我试过的是:使用memcpy将函数复制到RAM中的字节数组(检查它是否正确对齐),将函数指针设置为指向字节数组然后调用函数(指针)。 这可能适用于10条指令(我可以跟随调试器的执行)但然后我得到一个总线错误并且处理器重置。 第二次通过循环时发生总线错误,因此代码应该没问题(因为它在第一次传递时起作用)。 我认为更快的RAM访问会以某种方式破坏总线时序…… 无论如何有一个正确的方法来做到这一点? 分散文件如何将函数自动放入RAM中(我使用Keil uVision for Cortex-M3)? 编辑:更多信息:工具链:RealView MDK-ARM V 4.10编译器:Armcc v4.0.0.728汇编程序:Armasm v4.0.0.728链接器:ArmLink v4.0.0.728处理器:STM32F103ZE 发生复位时,IMPRECISERR位在总线故障寄存器中置1。

SIGTRAP尽管没有设置断点; 隐藏的硬件断点?

我正在为STM32嵌入式系统调试这个软件。 在其中一个函数中,我的程序一直在遇到某种断点: SIGTRAP,跟踪/断点陷阱 但是,在GDB中,当我执行info breakpoints我得到No breakpoints or watchpoints 。 断点实际上对应于我在很久以前设置的断点,在另一个版本的可执行文件中。 当我设置该断点时,GDB告诉我automatically using a hardware breakpoint on read-only memory (或类似消息) automatically using a hardware breakpoint on read-only memory 。 我认为硬件断点仍然在我的芯片上,尽管已经加载了新版本的软件。 如果确实存在虚假断点,我该如何找到并删除它?

在数组中移动元素

我需要一些帮助。 我想将数组中的元素向上移动一个元素,以便新位置1包含位置1的旧值,new-2包含old-1,依此类推。 旧的最后一个值被丢弃,第一个位置的新值是我每秒给出的一个新值。 我使用大小为10的数组: uint32_t TEST[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 我使用的代码必须每秒执行一次。 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { /* Code for shifting the elements */ for (int i = 0; i < 9; i++) { TEST[i+1] = TEST[i]; } TEST[0] = HAL_ADC_GetValue(&hadc); }

从中断返回后的轻微延迟

我写了一个小程序,它使用STM32 Discovery板上的一个按钮作为二进制/十进制/hex模式的计数器(屏幕循环通过3个选项,一旦按下,每次按下最多计数16,然后重置为骑车穿越选项)。 我遇到了一个让我有点困惑的小“虫子”(读,不是真的)。 如果我以十进制/hex计数,它会立即返回循环选项,但如果我在二进制中计数,则需要大约1秒左右才会这样做(明显的延迟)。 int main(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); lcd_init(); button_init(); while (1) { while (!counting) { standard_output(); } } } void standard_output(void) { state = 0; lcd_command(0x01); delay_microsec(2000); lcd_putstring(“Binary”); for (i=0; i<40; i++) delay_microsec(50000); // keep display for 2 secs if (counting) return; // if we have pressed the button, want to exit this […]

哪些变量类型/大小在STM32微控制器上是primefaces的?

以下是STM32微控制器上的数据类型: http : //www.keil.com/support/man/docs/armcc/armcc_chr1359125009502.htm 。 这些微控制器使用32位ARM核心处理器。 哪些数据类型具有自动primefaces读取和primefaces写入访问权限? 我很确定所有32位数据类型都有(因为处理器是32位),并且所有64位数据类型都不行(因为读取或写入64位字需要至少2个处理器操作),但是bool (1字节)和uint16_t / int16_t (2字节)怎么样? 上下文:我在STM32上的多个线程(单核,multithreading,或称为FreeRTOS中的 “任务”)之间共享变量,需要知道是否需要通过关闭中断来强制执行primefaces访问,互斥体等 更新: 请参阅此示例代码: volatile bool shared_bool; volatile uint8_t shared u8; volatile uint16_t shared_u16; volatile uint32_t shared_u32; volatile uint64_t shared_u64; volatile float shared_f; // 32-bits volatile double shared_d; // 64-bits // Task (thread) 1 while (1) { // Write to the values in […]