Tro*_*ach 5 c microcontroller stm32 i2c freertos
解决方案是关闭初始化模块中的 I2C 时钟。尽管 STM 可以处理它,但 LCD 的数据表表明它只能处理高达 10kHz 的频率。
对于 DMA,必须在 CubeMX 软件中启用和设置一个 IRQ,以启用 DMA TX/RX 线。
我正在使用带有 freeRTOS 的 STM32 - Nucleo-F401RE 板。我最近使用过 freeRTOS,但我从未真正使用过 I2C。
尝试使用 CubeMX 生成的 I2C 驱动程序设置一个简单的LCD 显示器。
到目前为止,它只发送了我请求发送的数据的一半左右。我已经使用简单的“show firmware”命令对其进行了测试,并且可以正常工作。所以我可以验证 I2C 实例是否设置正确。
/* I2C1 init function */
static void MX_I2C1_Init(void)
{
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK)
{
Error_Handler();
}
}
Run Code Online (Sandbox Code Playgroud)
它还具有国际上拉电阻设置。
/* vdebugTask function */
void vdebugTask(void const * argument)
{
/* USER CODE BEGIN vdebugTask */
/* Infinite loop */
for(;;)
{
char hi[6];
hi[0] = 'h';
hi[1] = 'e';
hi[2] = 'y';
hi[3] = 'a';
hi[4] = 'h';
hi[5] = '!';
HAL_I2C_Master_Transmit_DMA(&hi2c1, (0x50), hi, 6);
vTaskDelay(10);
}
/* USER CODE END vdebugTask */
}
Run Code Online (Sandbox Code Playgroud)
这是我正在尝试运行的代码,我根本没有更改 HAL 函数。我认为没有比这更简单的事情了,但这就是所发生的一切。
我遵循了 LCD 数据表中的时序约束,CubeMX 软件没有在任何地方警告或说明他们的 I2C 驱动程序有任何特殊要求。我的程序有问题吗?
我也尝试过使用同样由 CubeMX 创建的非 DMA 阻塞模式轮询传输函数
HAL_I2C_Master_Transmit(&hi2c1, (0x50), hi, 6, 1000);
Run Code Online (Sandbox Code Playgroud)
这甚至更糟,只是不断地向屏幕发送难以理解的文本。