stm32并行输入的端口如何变成并读出数据按顺序存到数组并把数组发送到串口里面hal库详细编写
时间: 2024-06-09 08:09:18 浏览: 98
stm32f4上hal库串口收发源程序
首先,需要明确的是STM32的并行输入端口是通过GPIO口实现的,因此需要配置对应的GPIO口为输入模式,并设置相应的引脚模式。一般情况下,STM32的并行输入端口都是通过外部总线接口(比如FSMC总线)与外部设备相连的,因此还需要配置相应的外部总线接口。接下来,可以采用中断方式读取并行输入端口的数据,将数据按顺序存储到数组中,并通过串口发送出去。
以下是一个简单的示例代码,使用HAL库实现上述功能:
```
// 定义并行输入端口读取的数据长度
#define DATA_LENGTH 8
// 定义存储读取数据的数组
uint8_t data[DATA_LENGTH];
// 定义标志位,用于判断是否已经读取了数据
volatile uint8_t dataReady = 0;
// 定义GPIO口和FSMC总线配置结构体
GPIO_InitTypeDef GPIO_InitStruct;
FSMC_NORSRAM_InitTypeDef FSMC_InitStruct;
FSMC_NORSRAM_TimingTypeDef FSMC_TimingInitStruct;
// 初始化GPIO口和FSMC总线
void GPIO_FSMC_Init(void)
{
// 初始化GPIO口
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3
| GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
// 初始化FSMC总线
FSMC_TimingInitStruct.AddressSetupTime = 0;
FSMC_TimingInitStruct.AddressHoldTime = 0;
FSMC_TimingInitStruct.DataSetupTime = 2;
FSMC_TimingInitStruct.BusTurnAroundDuration = 0;
FSMC_TimingInitStruct.CLKDivision = 0;
FSMC_TimingInitStruct.DataLatency = 0;
FSMC_TimingInitStruct.AccessMode = FSMC_ACCESS_MODE_A;
FSMC_InitStruct.NSBank = FSMC_NORSRAM_BANK1;
FSMC_InitStruct.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;
FSMC_InitStruct.MemoryType = FSMC_MEMORY_TYPE_SRAM;
FSMC_InitStruct.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_8;
FSMC_InitStruct.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;
FSMC_InitStruct.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
FSMC_InitStruct.WrapMode = FSMC_WRAP_MODE_DISABLE;
FSMC_InitStruct.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;
FSMC_InitStruct.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;
FSMC_InitStruct.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;
FSMC_InitStruct.ExtendedMode = FSMC_EXTENDED_MODE_DISABLE;
FSMC_InitStruct.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
FSMC_InitStruct.WriteBurst = FSMC_WRITE_BURST_DISABLE;
FSMC_InitStruct.ContinuousClock = FSMC_CONTINUOUS_CLOCK_SYNC_ONLY;
HAL_NOR_MspInit();
HAL_NORSRAM_Init(&FSMC_InitStruct, &FSMC_TimingInitStruct);
}
// 读取并行输入端口的数据,并存储到数组中
void ReadParallelPort(void)
{
// 读取并行输入端口的数据
data[0] = HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_0);
data[1] = HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_1);
data[2] = HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_2);
data[3] = HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_3);
data[4] = HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_4);
data[5] = HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_5);
data[6] = HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_6);
data[7] = HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_7);
// 标志位设为1,表示已经读取了数据
dataReady = 1;
}
// 发送数据到串口
void SendDataToSerial(void)
{
// 循环发送数组中的数据
for (int i = 0; i < DATA_LENGTH; i++) {
HAL_UART_Transmit(&huart1, &data[i], 1, 100);
}
}
int main(void)
{
// 初始化GPIO口和FSMC总线
GPIO_FSMC_Init();
// 配置GPIO口的中断模式,用于读取并行输入端口的数据
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
// 循环读取并发送数据
while (1)
{
// 判断是否已经读取了数据
if (dataReady) {
// 发送数据到串口
SendDataToSerial();
// 标志位设为0,表示已经发送了数据
dataReady = 0;
}
}
}
// GPIO口的中断处理函数,用于读取并行输入端口的数据
void EXTI0_IRQHandler(void)
{
// 读取并存储数据
ReadParallelPort();
// 清除中断标志位
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}
```
以上代码仅供参考,具体的实现方式可能会因为硬件平台和需求的不同而有所差异,需要根据实际情况进行调整。
阅读全文