2023-10-13 03:08 AM
hi I am working on keyboard project where i want to read B port"
KeyInputMemory[column_count] = (uint16_t) HAL_GPIO_ReadPin(rowport, GPIO_PIN_All);
iam taking rows as input... whenever key is pressed it should be read that pin.... how can i see whether particular address is stored or not in software
2023-10-13 05:01 AM - edited 2023-10-13 05:06 AM
Look at the source code of Hal_GPIO_ReadPin, and you will see why your approach is not correct:
/**
* @brief Reads the specified input port pin.
* GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or
* x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices.
* GPIO_Pin specifies the port bit to read.
* This parameter can be GPIO_PIN_x where x can be (0..15).
* @retval The input port pin value.
*/
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
GPIO_PinState bitstatus;
/* Check the parameters */
assert_param(IS_GPIO_PIN(GPIO_Pin));
if((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET)
{
bitstatus = GPIO_PIN_SET;
}
else
{
bitstatus = GPIO_PIN_RESET;
}
return bitstatus;
}
You can also see that reading the IDR register directly as in the source code presented at line 16 can be an answer to your question.
This approach is done in the LL (alternative to hal) functions to read ports:
/**
* @brief Return full input data register value for a dedicated port.
* @rmtoll IDR IDy LL_GPIO_ReadInputPort
* @PAram GPIOx GPIO Port
* @retval Input data register value of port
*/
__STATIC_INLINE uint32_t LL_GPIO_ReadInputPort(GPIO_TypeDef *GPIOx)
{
return (uint32_t)(READ_REG(GPIOx->IDR));
}
But therefore you need to enable in cubemx the LL functions for GPIO.
2023-10-13 10:10 PM
../Drivers/CMSIS/Device/ST/STM32F7xx/Include/stm32f730xx.h:985:31: error: expected declaration specifiers or '...' before '(' token
985 | #define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000UL)
| ^
../Drivers/CMSIS/Device/ST/STM32F7xx/Include/stm32f730xx.h:1044:32: note: in expansion of macro 'AHB1PERIPH_BASE'
1044 | #define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400UL)
| ^~~~~~~~~~~~~~~
../Drivers/CMSIS/Device/ST/STM32F7xx/Include/stm32f730xx.h:1169:47: note: in expansion of macro 'GPIOB_BASE'
1169 | #define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
| ^~~~~~~~~~
../Core/Src/main.c:363:50: note: in expansion of macro 'GPIOB'
363 | uint16_t HAL_GPIO_ReadPort(GPIO_TypeDef* GPIOB);
| ^~~~~ i have used above code as referrence but iam getting this error
2023-10-14 02:01 AM
KeyInputMemory[column_count] = (uint16_t)(GPIOB->IDR);
uint16_t mask = 0x0FFF;
KeyInputMemory[column_count] &= mask;
if (KeyInputMemory[column_count] == StoredKeyInput[column_count]) { //
KeyInputCounter[column_count]++;
if (KeyInputCounter[column_count] > 5) {
StoredKeyInput[column_count] = KeyInputMemory[column_count];
// Reset the counter
//KeyInputCounter[column_count] = 0;
}
} else {
// Store the current key input into the column stored key input
StoredKeyInput[column_count] = KeyInputMemory[column_count];
// Clear the key input count
KeyInputCounter[column_count] = 0;
//EXIT
return;
} I have physical keyboard i have to read b port but not detecting is my logic is true or false....... whenever key is pressed not reading the values