本帖最后由 jinglixixi 于 2022-12-13 14:55 编辑
ST NUCLEO-U575ZI开发板是一款面向性能测评的开发板,但在具体使用时则需要为它配置相应的外设。
为了能更直观地查看内部的数据变化,这里为它配置了一个串行数码管显示模块来实现显示功能。
该显示模块以MAX7219为核心,并具有数据缓存、驱动和自动刷新显示功能。由于是采用串行的方式工作,故可以很好地节省GPIO口的开销。
该显示模块与开发板的连接关系为:
DIN---PA5
CLK---PA6
CS ---PA7
以GPIO口驱动该显示模块进行高低电平输出的引脚定义为:
#define DIN_SetHigh() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, 1) // CLK
#define DIN_SetLow() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, 0)
#define CLK_SetHigh() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, 1) // DIN
#define CLK_SetLow() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6,0)
#define CS_SetHigh() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7,1) // CS
#define CS_SetLow() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7,0)
对所用引脚的配置函数为:
void app_MAX7219(void)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
对MAX7219进行初始化处理的函数为:
void Init_MAX7219(void)
{
Write_Max7219(0x09, 0xff);
Write_Max7219(0x0a, 0x02);
Write_Max7219(0x0b, 0x07);
Write_Max7219(0x0c, 0x01);
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
使用MAX7219向指定地址发送控制字的函数为:
void Write_Max7219(char address,char dat)
{
CS_SetLow();
Write_Max7219_byte(address);
Write_Max7219_byte(dat);
CS_SetHigh();
}
使用图1显示效果的测试主程序为:
int main(void)
{
HAL_Init();
SystemClock_Config();
SystemPower_Config();
MX_ICACHE_Init();
LED1_GPIO_CLK_ENABLE();
LED2_GPIO_CLK_ENABLE();
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Pin = LED1_PIN;
HAL_GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LED2_PIN;
app_MAX7219();
Init_MAX7219();
Write_Max7219(1,1);
Write_Max7219(2,2);
Write_Max7219(3,3);
Write_Max7219(4,4);
Write_Max7219(5,5);
Write_Max7219(6,6);
Write_Max7219(7,7);
Write_Max7219(8,8);
while (1)
{
HAL_GPIO_TogglePin(LED1_GPIO_PORT, LED1_PIN);
HAL_Delay(100);
HAL_GPIO_TogglePin(LED2_GPIO_PORT, LED2_PIN);
HAL_Delay(100);
}
}
图1 显示效果
此外,为了进行参数的设置,还为它配置了一个软按键,它可以实现+1、-1、移位及确认功能。
各按键与开发板的连接关系为:
K2--- PB1
K1--- PC2
K3--- PA2
K4--- PA1
其中:
K2--- 加1
K1--- 减 1
K3--- 移位
K4--- 确认PA1
对按键各引脚的配置函数为:
void app_key(void)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}
实现参数设置的主程序为:
int main(void)
{
int i;
HAL_Init();
SystemClock_Config();
SystemPower_Config();
MX_ICACHE_Init();
app_MAX7219();
Init_MAX7219();
Write_Max7219(1,0);
Write_Max7219(2,0);
Write_Max7219(3,15);
Write_Max7219(4,15);
Write_Max7219(5,15);
Write_Max7219(6,15);
Write_Max7219(7,15);
Write_Max7219(8,15);
app_key();
i=0;
HAL_Delay(200);
while (1)
{
if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_2)==0) i=(i+1)%100;
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1)==0) i=(i-1)%100;
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2)==0) i=(i*10)%100;
Write_Max7219(1,i%10);
Write_Max7219(2,i/10);
HAL_Delay(300);
}
}
图2 键入效果