![shequ.stmicroelectronics.cn](./template/st_v1/static/img/logo2.png)
IAR 9.x环境下STM32重定向串口scanf如何实现?
stm32cubeide生成的freertos断言失败
使用stm32cubemx生成freertos cmisi v2版本的代码报错
CubeAI如何加载caffe模型
STM32cubeide报错,但是使用STM32cubeprogram可以正常烧写程序
搜所了博客用stm32cubemx写一个简单adc获取值的例子 ,烧录到板子里导致芯片(STM32H750XBH6)锁死(怀疑配置的时钟频率和板子要求的不一样),不知道如何解除 芯片死锁。
STM32CUBE报错
X-CUBE-AI用官方模型进行压缩时,编解码器无法解码位置8中的字节
STM32F103定时器输入捕获最小可以捕获多大的周期
HAL库,驱动步进电机不转
自己顶一下,好像发送不了ZIP和附件~没代码应该也没关系吧,应该也够了吧。囧
LCDST7565P.c
include "stm32f1xx_hal.h"
include "gpio.h"
include "LCDST7565P.h"
include "ziku.h"
//以下部分在gpio.C文件中已完成初始化,这边可能冲突,不做定义 //void LCD12864_UserConfig(void){
// GPIO_InitTypeDef GPIO_InitStructure; //定义结构体
// __HAL_RCC_GPIOB_CLK_ENABLE();//使能 GPIOB 时钟。
// GPIO_InitStructure.Pin = LCD_DATA_PIN ; //配置引脚 数据部分 // GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; //定义输出速率为高速 // GPIO_InitStructure.Mode =GPIO_MODE_OUTPUT_PP;//设置数据输出为推挽输出 // HAL_GPIO_Init(LCD_DATA_PROT,&GPIO_InitStructure);//对上述进行初始化。
// GPIO_InitStructure.Pin = RS | RD | WR ; //配置引脚 数据部分 // GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; //定义输出速率为高速 // GPIO_InitStructure.Mode =GPIO_MODE_OUTPUT_PP;//设置数据输出为推挽输出 // HAL_GPIO_Init(LCD_CMD_PROT,&GPIO_InitStructure);//对上述进行初始化。
//} uint16_t temp; //写命令至12864 void LCD12864_write_cmd(uint16_t CMD){
// HAL_GPIO_WritePin(GPIOB, D0_Pin|D1_Pin|D2_Pin|D3_Pin|D4_Pin|D5_Pin|D6_Pin|D7_Pin,CMD); HAL_Delay(2); WR_HIGH; }
//写数据至12864 void LCD12864_write_data(uint16_t data){
// HAL_GPIO_WritePin(GPIOB, D0_Pin|D1_Pin|D2_Pin|D3_Pin|D4_Pin|D5_Pin|D6_Pin|D7_Pin,data); HAL_Delay(2); WR_HIGH;
} //初始化12864 void LCD12864_Init(){
}
//清屏12864 void LCD12864_ClearScreen(void){
unsigned char i, j;
}
/***
ifdef CHAR_CODE
extern "C" {
endif
unsigned char Lcd12864_Write16CnCHAR(unsigned char Page, unsigned char Column, char *cn) { unsigned char j, x1, x2, wordNum;
if(Page > 7) return 0; //页坐标只能从0到7,大于则直接返回 if(Column > 128) return 0; //列的坐标只能从0到127,大于则直接返回 Page += 0xB0; //求取页坐标的值 不能放在while里面
while ( *cn != '\0') //在C语言中字符串结束以‘\0’结尾 { LCD12864_write_cmd(Page); //设置页坐标
} return 1; }
ifdef CHAR_CODE
}
endif
LCDST7565P.h
ifndef _LCDST7565PH
define _LCDST7565PH
include "stm32f1xx_hal.h"
include "gpio.h"
// GPIO_SETLOWBITS(GPIOB,UINT8) / GPIOB->ODR =/ ((GPIOB->ODR)&0x3F90) + UINT8 方式一失败 //#define LCD_DATA_PIN GPIOB->ODR = 0x3F90 //方式二失败
define LCD_DATA_PIN(newdata); GPIOB->ODR =newdata //GPIOB->ODR = GPIOB->ODR & 0x23F8 | newdata; //方式三
// 设置十六进制C8T6上设置PB3&D0\PB4&D1\PB5&D2\PB6&D3\PB7&D4\PB8&D5\PB9&D6\PB12&D7 //十六进制为0011 1111 1001 0000 注意,如果出现显示不正常现象,低位先进,则设置0x09F3 // #define LCD_DATA_PROT GPIOB //设置GPIOB为数据DATA
//以下部分在gpio.C文件中已完成宏定义,这边可能冲突,不做定义 //#define RS RS_Pin //数据指令选择 高电平数据 低电平指令 //#define RD RD_Pin //读使能 低电平有效 //#define WR WR_Pin //写使能 低电平有效 //#define LCD_CMD_PROT GPIOB //该分组为GPIOB?
//#define REST REST_Pin //复位 低电平有效 //#define LCD_REST_PROT GPIOC
//#define CS CS_Pin //片选 低电平有效 //#define LCD_CS_PROT GPIOA
//宏定义,设置各个控制脚,简化代码长度
define CS_LOW HAL_GPIO_WritePin (GPIOA,CS_Pin,GPIO_PIN_RESET);
define CS_HIGH HAL_GPIO_WritePin (GPIOA,CS_Pin,GPIO_PIN_SET);
define RS_LOW HAL_GPIO_WritePin (GPIOB,RS_Pin,GPIO_PIN_RESET);
define RS_HIGH HAL_GPIO_WritePin (GPIOB,RS_Pin,GPIO_PIN_SET);
define RD_LOW HAL_GPIO_WritePin (GPIOB,RD_Pin,GPIO_PIN_RESET);
define RD_HIGH HAL_GPIO_WritePin (GPIOB,RD_Pin,GPIO_PIN_SET);
define WR_LOW HAL_GPIO_WritePin (GPIOB,WR_Pin,GPIO_PIN_RESET);
define WR_HIGH HAL_GPIO_WritePin (GPIOB,WR_Pin,GPIO_PIN_SET);
define REST_LOW HAL_GPIO_WritePin (GPIOC,REST_Pin,GPIO_PIN_RESET);
define REST_HIGH HAL_GPIO_WritePin (GPIOC,REST_Pin,GPIO_PIN_SET);
//void LCD12864_UserConfig(void); void LCD12864_write_cmd(uint16_t CMD); void LCD12864_write_data(uint16_t data); void LCD12864_Init(void); void LCD12864_ClearScreen(void); unsigned char Lcd12864_Write16CnCHAR(unsigned char Page, unsigned char Column, char *cn);
endif
ziku.h
ifndef __CHARCODE_H
define __CHARCODE_H
ifdef CHAR_CODE
extern "C" {
endif
// ------------------ 汉字字模的数据结构定义 ------------------------ // struct Cn16CharTypeDef // 汉字字模数据结构 { unsigned char Index[2]; // 汉字内码索引,一个汉字占两个字节 unsigned char Msk[32]; // 点阵码数据(16*16有32个数据) };
//struct Cn16CharTypeDef code CN16CHAR[]=
struct Cn16CharTypeDef CN16CHAR[] = {
/-- 文字: 液 --/ /-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --/ "液",0x10,0x60,0x02,0x8C,0x00,0x84,0xE4,0x1C,0x05,0xC6,0xBC,0x24,0x24,0xE4,0x04,0x00, 0x04,0x04,0x7E,0x01,0x00,0x00,0xFF,0x82,0x41,0x26,0x18,0x29,0x46,0x81,0x80,0x00,
/-- 文字: 晶 --/ /-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --/ "晶",0x00,0x00,0x00,0x00,0x7F,0x49,0x49,0x49,0x49,0x49,0x7F,0x00,0x00,0x00,0x00,0x00, 0x00,0xFF,0x49,0x49,0x49,0x49,0xFF,0x00,0xFF,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,
/-- 文字: 显 --/ /-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --/ "显",0x00,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x00, 0x40,0x42,0x44,0x58,0x40,0x7F,0x40,0x40,0x40,0x7F,0x40,0x50,0x48,0x46,0x40,0x00,
/-- 文字: 示 --/ /-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --/ "示",0x40,0x40,0x42,0x42,0x42,0x42,0x42,0xC2,0x42,0x42,0x42,0x42,0x42,0x40,0x40,0x00, 0x20,0x10,0x08,0x06,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x02,0x04,0x08,0x30,0x00,
/-- 文字: 文 --/ /-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --/ "文",0x08,0x08,0x08,0x38,0xC8,0x08,0x09,0x0E,0x08,0x08,0xC8,0x38,0x08,0x08,0x08,0x00, 0x80,0x80,0x40,0x40,0x20,0x11,0x0A,0x04,0x0A,0x11,0x20,0x40,0x40,0x80,0x80,0x00,
/-- 文字: 字 --/ /-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --/ "字",0x10,0x0C,0x04,0x24,0x24,0x24,0x25,0x26,0xA4,0x64,0x24,0x04,0x04,0x14,0x0C,0x00, 0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,
/-- 文字: 测 --/ /-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --/ "测",0x10,0x60,0x02,0x8C,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0xFF,0x00,0x00, 0x04,0x04,0x7E,0x01,0x80,0x47,0x30,0x0F,0x10,0x27,0x00,0x47,0x80,0x7F,0x00,0x00,
/-- 文字: 试 --/ /-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --/ "试",0x40,0x40,0x42,0xCC,0x00,0x90,0x90,0x90,0x90,0x90,0xFF,0x10,0x11,0x16,0x10,0x00, 0x00,0x00,0x00,0x3F,0x10,0x28,0x60,0x3F,0x10,0x10,0x01,0x0E,0x30,0x40,0xF0,0x00,
};
endif //end of CHAR_CODE
ifdef CHAR_CODE
}
endif
main.c 主函数部分
int main(void) { / USER CODE BEGIN 1 /
/ USER CODE END 1 /
/ MCU Configuration--------------------------------------------------------/
/ Reset of all peripherals, Initializes the Flash interface and the Systick. / HAL_Init();
/ USER CODE BEGIN Init /
/ USER CODE END Init /
/ Configure the system clock / SystemClock_Config();
/ USER CODE BEGIN SysInit /
/ USER CODE END SysInit /
/ Initialize all configured peripherals / MX_GPIO_Init(); MX_ADC1_Init(); MX_I2C2_Init(); MX_SPI1_Init(); / USER CODE BEGIN 2 /
__HAL_RCC_GPIOB_CLK_ENABLE();
// unsigned char i;
LCD12864_Init();
LCD12864_ClearScreen(); / USER CODE END 2 /
/ Infinite loop / / USER CODE BEGIN WHILE / while (1) { / USER CODE END WHILE /
/ USER CODE BEGIN 3 / LCD12864_ClearScreen(); // 页地址 列地址 显示文字 Lcd12864_Write16CnCHAR(0, 0, "液晶显示文字测试"); Lcd12864_Write16CnCHAR(2, 0, "试测字文示显晶液"); Lcd12864_Write16CnCHAR(4, 0, "显示文字测试液晶"); Lcd12864_Write16CnCHAR(6, 0, "文字显示液晶测试"); HAL_Delay(200); //不能删除,如删除会出现文字清屏不彻底导致留尾巴
// for (i=0; i<8; i += 2) // { // LCD12864_ClearScreen(); // Lcd12864_Write16CnCHAR(i, 0, "液晶显示文字测试"); // HAL_Delay(200); // }
} / USER CODE END 3 /
}
你基于位操作一位位写来准备数据,也不用多少时间,写完后使能片选。你结合LCD的控制时序图看看。
所以同时给数据是个相对概念,按照这个连线,无非数据准备时间长一点点,即使分布在同一口上,也就快了几个指令周期而已。
所以很有可能是控制逻辑出了问题,最好再看看规格书。
感谢,但是我排查了电路,用示波器检测,发现其他端口均正常,就D7这个PIN的输出速率和电平不正常,然后在代码分析里面检测了DATA这个值,发现一直为0,所以觉得是数据没有写进去,代码是根据51移植的,所以感觉很大可能是赋值操作,,,,我再继续排查吧~
谢谢,代码是51单片机移植过来的,控制逻辑上感觉应该是没有太大问题,用示波器检测发现电平端口也正常,后在程序内检测DATA值一直为0,结合示波器D7端口的异常现象,觉得是值没有写到LCD内导致....