我正在尝试编程stm32与我的i2c EEprom交谈,但似乎每次我说:
I2C_GenerateSTART(I2C1, ENABLE);
while( !(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) ); the code hangs here
Run Code Online (Sandbox Code Playgroud)
我经历了调试器,我发现SR1位0标志(它是起始位生成标志)未设置,这就是代码挂起的原因.我可以在示波器中看到生成了起始位,这有时会起作用.当我试图连续写几次时,它通常会中断.我检查了硬件是否一切看起来很好我检查了我在i2c总线上运行的频率它在24lc1025 eeprom内是100Khz.
有任何想法吗,
谢谢
我写了(IMO)几乎最简单的ARM应用程序,它没有工作:)什么可能是错的?错过了什么?
闪存写入和CPU复位后,寄存器中有垃圾.
请善待,如果你知道,请告诉我在STM32F1上运行最简单的应用程序需要做些什么.
也许是某人可以列举在申请开始前必须做的事情,即.
应用程序:
@Directives
.thumb @.code 16
.syntax unified
.section .text
.org 0 @ Alters location of pointer - in this case set to zero
vectors: @ Define basic vectors for specific capabilities
.word _start + 1 @ Set - start address and increment pointer
.word _nmi_handler + 1 @ Below all other vectors will be declared:
.word _hard_fault + 1
.word _memory_fault + 1
.word _bus_fault + 1
.word _usage_fault + 1
_start:
mov …Run Code Online (Sandbox Code Playgroud) 我正在研究STM32F4 CPU上的一个项目,产生信号.
我在STM32上有CPU时钟(没有预分频器)的通用定时器,在溢出时触发中断,然后用GPIO产生周期信号.
我需要在非常精确的时间触发GPIO(基本上低至一个CPU周期精度).通过设置优先级等,我已设法将此抖动减少到+ -5个周期,但这种抖动存在,具体取决于CPU的工作情况.
我需要补偿这几个周期的抖动.只要我在精确的时间切换GPIO,添加几个周期的延迟就不是问题.
我的想法是读取计数器的当前值,并有一个FIXED_NUMBER-CURRENT_VALUE时间的活动循环,确保我将在精确的时间退出循环.
然而,在C中做一个简单的循环 - 一个FOR循环,或一个while(counter-> value <TARGET)不起作用,因为它ADDS抖动而不是减少它.
我做错了什么/天真吗?我应该在集会中这样做吗?怎么会与C不同(我检查了用GCC反汇编来检查循环没有被优化掉,也不是我打了内存?)
(我确保空的,非优化的但不打击内存循环体)
编辑:在AVR上看到这个例子(我知道的更稳定)请参见示例http://lucidscience.com/pro-vga%20video%20generator-7.aspx (搜索"jitter")
edit2:我在汇编中尝试了一个简单的循环,例如(r0是我的计数器,等待的循环次数,在寄存器中)
loop : SUBS r0,#1 ; tried with 2 also
BGE loop
Run Code Online (Sandbox Code Playgroud)
而且,如果没有它,抖动会更好.
总结起来,我已经知道我应该拖延多少.我只需要一种方法让代码分支在一个案例中可靠地消耗N个循环而在另一个案例中可以消耗M. 不幸的是,单独的分支似乎不起作用,因为管道填充似乎不需要可靠的循环次数,并且条件表达式也不会因为它们总是采用相同数量的循环(有时无效).
从RAM而不是闪存运行会提高一致性吗?(NB stm32f4有一个flash预取..)
我想知道从dma写入数据的内存中读取是否安全?
我有一个带有adc设置的stm32F1,可以连续执行转换并使用dma将数据传输到ram缓冲区.我知道我可以使用adc中断安全地访问缓冲区,但是如何从非中断上下文访问缓冲区呢?如果我尝试从dma写的相同位置读取数据,数据是否会被破坏?
我正在研究STM32 F103x上的ADC编程,从最简单的情况开始 - 单次转换.测量内部温度传感器(连接到ADC1)的值,并使用USART将其发送到COM端口.目标似乎很清楚但是当我尝试将源代码下载到闪存时,它不会向COM端口发送任何数据.USART功能运行良好,我猜这些问题来自ADC配置部分,因为我正处于等待完全转换的循环中:
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); //Wail for conversion complete
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止的源代码.
/* Includes ------------------------------------------------------------*/
#include "stm32f10x.h"
#include <stdio.h>
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 ch;
}
void Usart1Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
/* COnfig PA9 for USART Tx as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin …Run Code Online (Sandbox Code Playgroud) 我正在使用stm32f0 MCU.
我有一个简单的UART回声代码,其中接收的每个字节都将被传输出去.我测试它是否有效.这里是;
uint8_t Rx_data[5];
uint32_t tx_timeout = 0;
//Interrupt callback routine
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1) //current UART
{
HAL_UART_Transmit(&huart1, &Rx_data[0], 1, tx_timeout);
HAL_UART_Receive_IT(&huart1, Rx_data, 1); //activate UART receive interrupt every time on receiving 1 byte
}
}
Run Code Online (Sandbox Code Playgroud)
即使它有效,我对代码感到不舒服.首先,tx_timeout是0并且大多数代码示例都是非零的.我不知道副作用.其次,HAL_UART_Transmit()是一个阻塞调用,不建议在中断中使用阻塞调用.所以,我决定使用中断进行uart传输HAL_UART_Transmit_IT()而不是阻塞调用.这是修改后的代码;
uint8_t Rx_data[5];
uint32_t tx_timeout = 0;
//Interrupt callback routine
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1) //current UART
{
HAL_UART_Transmit_IT(&huart1, &Rx_data[0], 1);
HAL_UART_Receive_IT(&huart1, Rx_data, 1); //activate UART receive interrupt every …Run Code Online (Sandbox Code Playgroud) 我正在使用基于微控制器STM32F401RET6的Nucleo F401Re板.我连接到主板上的Micro SD插槽,并有兴趣将数据写入SD卡并从中读取数据.我使用软件STM32CubeX生成代码,特别是带有内置函数的SD库.我试着编写一个简单的代码,将一个数组写入一个特定的数组,然后尝试读取相同的数据.代码如下:
int main(void)
{
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART2_UART_Init();
MX_SDIO_SD_Init();
char buffer[14] = "Hello, world\n";
uint32_t to_send[512] ; // Te
uint32_t to_receive[512];
uint64_t address = 150;
HAL_SD_WriteBlocks(&hsd, to_send, address, 512, 1);
HAL_SD_ReadBlocks(&hsd, to_receive, address, 512, 1);
while (1)
{
HAL_UART_Transmit(&huart2, (uint8_t *)buffer, 14, 1000);
HAL_UART_Transmit(&huart2, (uint8_t *)to_receive, 512, 1000);
}
Run Code Online (Sandbox Code Playgroud)
代码在函数HAL_Init()的中间停止,我收到以下消息:
The stack pointer …Run Code Online (Sandbox Code Playgroud) 我们正在为STM32F103 MCU开发.我们在ARM GCC工具链中使用裸机C++代码.经过几个小时的可疑表达,我们发现constant关键字触发了该表达式的不同结果.使用x86 GCC工具链测试同一段代码时,问题就不存在了.
我们使用STM的GPIOS进行调试.
这是完全重现问题的代码:
#include "stm32f10x.h"
#include "system_stm32f10x.h"
#include "stdlib.h"
#include "stdio.h"
const unsigned short RTC_FREQ = 62500;
unsigned short prescaler_1ms = RTC_FREQ/1000;
int main()
{
//********** Clock Init **********
RCC->CFGR |= RCC_CFGR_ADCPRE_0 | RCC_CFGR_ADCPRE_1; // ADC prescaler
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; // Alternate Function I/O clock enable
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // I/O port C clock enable
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // I/O port A clock enable
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // ADC 1 interface clock enable
RCC->APB1ENR |= …Run Code Online (Sandbox Code Playgroud) 我正在尝试理解由另一个程序员编写的代码.它使用I²C通信在STM32微控制器的EEPROM上写入数据.
一般来说,我理解他的代码是如何工作的,但我无法理解他为什么使用HAL_LOCK和HAL_UNCLOCK函数.
这些是这些方法的代码:
typedef enum
{
HAL_UNLOCKED = 0x00U,
HAL_LOCKED = 0x01U
} HAL_LockTypeDef;
#if (USE_RTOS == 1)
/* Reserved for future use */
#error "USE_RTOS should be 0 in the current HAL release"
#else
#define __HAL_LOCK(__HANDLE__) \
do{ \
if((__HANDLE__)->Lock == HAL_LOCKED) \
{ \
return HAL_BUSY; \
} \
else \
{ \
(__HANDLE__)->Lock = HAL_LOCKED; \
} \
} while (0)
#define __HAL_UNLOCK(__HANDLE__) \
do{ \
(__HANDLE__)->Lock = HAL_UNLOCKED; \
} …Run Code Online (Sandbox Code Playgroud) 我正在使用STM32F4及其SPI与本教程中的74HC595进行通信。区别在于初学者,为简单起见,我使用非DMA版本。我使用STMCubeMX配置SPI和GPIO
问题是:我没有获得锁存器PIN,我将其设置为PA8以在传输期间足够快地切换。
我正在使用的代码:
spiTxBuf[0] = 0b00000010;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, spiTxBuf, 1, HAL_MAX_DELAY);
// while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
HAL_Delay(1);
Run Code Online (Sandbox Code Playgroud)
我尝试过的事情:
我如何才能更快地切换?我应该在SPI完成后创建并中断并在那里设置锁存器吗?