STM32F072CBU 微控制器。
我有多个 ADC 输入,希望单独读取它们。STMcubeMX 生成样板代码,假设我希望按顺序读取所有输入,但我无法弄清楚如何纠正这个问题。
这篇博文表达了我遇到的同样的问题,但给出的解决方案似乎不起作用。每次转换时打开和关闭 ADC 与返回值中的错误相关。仅当我在 STMcubeMX 中配置单个 ADC 输入,然后在不取消初始化 ADC 的情况下进行轮询时,才会返回准确的读数。
cubeMX的adc_init函数:
/* ADC init function */
static void MX_ADC_Init(void)
{
ADC_ChannelConfTypeDef sConfig;
/**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
*/
hadc.Instance = ADC1;
hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc.Init.Resolution = ADC_RESOLUTION_12B;
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc.Init.LowPowerAutoWait = DISABLE;
hadc.Init.LowPowerAutoPowerOff = DISABLE;
hadc.Init.ContinuousConvMode = DISABLE;
hadc.Init.DiscontinuousConvMode = DISABLE;
hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; …Run Code Online (Sandbox Code Playgroud) 我试图了解 STM32F091VB 如何使用以下功能通过串行协议管理数据发送HAL_UART_Transmit_IT()
目前,我在 main() 中调用了一个函数,该函数创建数据包并通过串行发送;它是这样的:
tx1[0] = STX;
tx1[1] = 0xFF;
tx1[2] = 0x80;
tx1[3] = 0x80;
DE_TAST_HIGH;
HAL_UART_Transmit_IT(&huart3, tx1, 8);
Run Code Online (Sandbox Code Playgroud)
现在,我发送的数据非常小,因此代码运行得非常快,我试图了解如果我尝试通过串行协议发送一个大数据包会发生什么。
例如,如果我的数据包tx1[]是 100 字节,则该HAL_UART_Transmit_IT()功能会阻止 CPU 在将完整数据包发送到串行端口时等待,或者它的工作方式更像是一个单独的进程,我告诉微控制器发送该数据包,并且在发送数据包的同时,它还处理剩余的数据包。我的代码/主要功能的一部分?
我试图在微型数据表上搜索,看看是否有关于此过程的信息,但我没有运气。我已阅读stm32f0xx_hal_uart.c并确认它是通过中断以非阻塞模式发送的,但我想有一些关于它的更深入的文档
我正在尝试为STM32F030x8编写一个bootloader应用程序.我通过UART将bin文件写入控制器.当UART RDR寄存器中存在数据时,我将其放入全局声明的1Kb缓冲区中.每次缓冲区已满,我都会尝试将其写入FLASH.写入FLASH后,应用程序向PC软件发出确认,并准备接受新的1Kb块.因此,在写入FLASH时,不会写入缓冲区.当我尝试将全局缓冲区写入FLASH时,应用程序进入Hardfault处理程序.
但是当我使用memcpy()将缓冲区复制到1Kb的本地声明的缓冲区中,并尝试将该缓冲区写入FLASH时,它没有任何问题.
为什么我不能只将全局声明的缓冲区写入FLASH?当本地声明的缓冲区写入FLASH时为什么没有问题?
提前致谢!
编辑:
uint32_t FLASH_If_Write(__IO uint32_t* FlashAddress, uint32_t* Data ,uint16_t DataLength)
{
uint32_t i = 0;
for (i = 0; (i < DataLength) && (*FlashAddress <= (USER_FLASH_END_ADDRESS-4)); i++)
{
/* the operation will be done by word */
if (FLASH_Program(FLASH_TYPEPROGRAM_WORD, *FlashAddress, *(uint32_t*)(Data+i)) == 1)
{
/* Check the written value */
if (*(uint32_t*)*FlashAddress != *(uint32_t*)(Data+i))
{
/* Flash content doesn't match SRAM content */
return(2);
}
/* Increment FLASH destination address */
*FlashAddress += 4;
}
else …Run Code Online (Sandbox Code Playgroud) 你能在这里帮我一下,告诉我我做错了什么吗?EXTI1 和 EXTI2 不会触发,而 EXTI4 则正常工作。这不是硬件。如果我切换引脚,新的 EXTI4 按钮将继续触发,而我切换它的按钮不再触发。
我已经彻底检查了所有段,但我无法弄清楚为什么 EXTI0_1_IRQHandler 没有触发,而 EXTI4_15_IRQHandler 没有触发。请参阅下面我用于库的两个文件。我在 OpenSTM32 IDE 中使用 SPL。“main.c”只调用
ENCODER_STM32_configureInterface();
Run Code Online (Sandbox Code Playgroud)
所以真的没有其他事情发生。
// ENCODER_STM32 library: This library shall enable interfacing an encoder on an STM32F0 chip.
// GPIO Definitions
#define ENCODER_GPIO_PORT GPIOA
#define ENCODER_GPIO_CLK_PIN GPIO_Pin_1
#define ENCODER_GPIO_DT_PIN GPIO_Pin_2
#define ENCODER_GPIO_SW_PIN GPIO_Pin_4
#define ENCODER_GPIO_PERIPH RCC_AHBPeriph_GPIOA
// EXTI Definitions
#define ENCODER_EXTI_PORTSRC EXTI_PortSourceGPIOA
#define ENCODER_EXTI_CLK_PINSRC EXTI_PinSource1
#define ENCODER_EXTI_CLK_LINE EXTI_Line1
#define ENCODER_EXTI_DT_PINSRC EXTI_PinSource2
#define ENCODER_EXTI_DT_LINE EXTI_Line2
#define ENCODER_EXTI_SW_PINSRC EXTI_PinSource4
#define ENCODER_EXTI_SW_LINE EXTI_Line4
#define ENCODER_EXTI_PERIPH RCC_APB2Periph_SYSCFG
#define ENCODER_EXTI_MODE …Run Code Online (Sandbox Code Playgroud) stm32 ×4
stm32f0 ×4
c ×3
adc ×1
arm ×1
bootloader ×1
flash-memory ×1
interrupt ×1
serial-port ×1
uart ×1