常用的lcd断码屏驱动芯片:HT1621 三线spi串口驱动...
利用stm8l152自带的lcd驱动,驱动一个14SEG,4个Com的段码屏这次需要驱动的段码屏是联想体重秤的段码屏,由于这样的屏大多是定制的,所以需要自己在能够驱动在屏幕上显示一个任何的东西,即表示能够被驱动起来(不知道它对应的引脚是不是正确的(和自己想的))段码屏可以显示汉字...
期待你的精彩评论 加入710人围观利用stm8l152自带的lcd驱动,驱动一个14SEG,4个Com的段码屏这次需要驱动的段码屏是联想体重秤的段码屏,由于这样的屏大多是定制的,所以需要自己在能够驱动在屏幕上显示一个任何的东西,即表示能够被驱动起来(不知道它对应的引脚是不是正确的(和自己想的))段码屏可以显示汉字...
期待你的精彩评论 加入710人围观
使用stm32f407zgt6的RMII接口驱动LAN8720的一些踩过的坑
使用spi读取xpt2046的一直错误,表现为,读取的adc数据在屏幕上分布不均匀
具体表现为:在屏幕的中心范围比较大的一圈,按下,读取到的adc值都是不变的,但是按照电阻屏的原理,这是不可能的事情,正常情况下,adc的采样值,应该在屏幕的横纵坐标上,应该是均匀的,按照一定比例的变化
通过函数传入一个指针,在函数中计算完毕,将值赋值给这个指针,发现,只要涉及小数计算的时候,直接进入硬件错误,去掉小数部分的计算,则一点问题都没有
问题代码:
// 读取电压(单位:mV) 电压值需按公式转换:VCELL = (data[0] << 8 | data[1]) * 78.125μV
HAL_StatusTypeDef MAX17048_ReadVoltage(uint16_t *voltage) {
uint8_t reg = REG_VCELL;
uint8_t data[2];
HAL_StatusTypeDef status = HAL_I2C_Master_Transmit(&hi2c2, MAX17048_ADDR, ®, 1, 1000);
if (status != HAL_OK) return status;
status = HAL_I2C_Master_Receive(&hi2c2, MAX17048_ADDR, data, 2, 1000);
*voltage = (data[0] << 8 | data[1])*78.125/1000;
return status;
}
如题所示,仿真定时器的时候,快于实际设定的值,原因在于设置仿真的时钟频率要正确
void MX_TIM2_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim2.Instance = TIM2;
htim2.Init.Prescaler = 71;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 999;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
__HAL_TIM_ENABLE(&htim2); // 启动定时器2
}
采用了结构体来确定数据结构,然后使用socker发送不了0x00,正常socker是可以发送0x00的
结构体定义
// 起始帧+结束帧
struct _YmodemStartEndFrame
{
uint8_t frameHeader; // 帧头
uint8_t packetNumber; // 包号
uint8_t packetNumberR; // 包号反码
uint8_t NUL[PACKET_SIZE]; // 数据存储区
uint8_t crc16H; // CRC校验位高
uint8_t crc16L; // CRC校验位低
};
最近踩的一个坑,stm32挂载好了一个fatfs,串口打印正常,但是只要是插入电脑,此时,往电脑中存入文件,都很正常然后复位stm32,就会导致fatfs重新格式化!!!文件全丢!
大意了!
读取wk2124 FIFO缓冲区
/*===================================================================================
功能:读取wk2124子串口的FIFO的数据
*port: 1~12,表示串口的标号(该串口标号由1个wk2124芯片片选将1个spi接口转换为12个串口)
*buf:用于接受数据的缓冲区
*len:要接受的数据长度(最大长度为FIFO中已经存在的数据长度)
*返回:所读取的子串口数据长度
*备注:gwh
====================================================================================*/
uint16_t WK_PortRecvData(uint8_t port, void *buf, uint16_t len)
{
uint8_t state = 0;
uint8_t nread = 0;
WK_CS_handler(port); // 片选三个wk2124中的一个
port = port % 4;
if (port == 0)
{
port = 4;
}
state = WK_ReadSReg(port, WK2XXX_FSR); // 读wk2124的子串口FIFO状态寄存器
if (state & WK2XXX_RDAT) // 接收FIFO非空
{
nread = WK_ReadSReg(port, WK2XXX_RFCNT); // 查询FIFO中的数据量
nread = (len >= nread ? nread : len);
WK_ReadFIFO(port, buf, nread); // 读取FIFO中的数据
}
return nread; // 返回实际读取到的数据长度
}
真的难受,原理图和实际引脚没有对上
原因
立创eda中的原理图:供应商编号:C277944
如果采用了DMA接收串口的数据,就不要在开启串口接收中断,这样的话,会导致数据接收错误
主要问题是在于FreeRTOS的堆栈使用问题,在从app跳转到Boot的时候,堆栈没有复位的问题