szkei

  • 2020-08-14
  • 发表了主题帖: 【ESK32-360测评】+LCD库函数BUG测评反馈

    本帖最后由 szkei 于 2020-8-14 22:41 编辑 一,上篇使用了LCD库函数显示奥运五色环及合泰测评的图片。帖子链接。 二,函数坐标顺序位置对调。       继续使用后发现上个测评所用到以下的函数的坐标顺序是对调,出来效果是X,Y坐标对调。         1,void  LCD_CircleDraw (u32 X_Location, u32 Y_Location, u32 Radius) ; //画半径参数的圆     2,void  LCD_LineDraw (u32 X_Location, u32 Y_Location, u32 Length, u32 Direction) ;//画线     3,void  LCD_PicDraw (u8 X_Location, u16 Y_Location, u8 Height, u16 Width, uc8 *Pptr) ;//显示图片     4, void  LCD_RectDraw (u32 X_Location, u32 Y_Location, u32 Height, u32 Width) //画方框 三,各个函数输入不同坐标显示。    1,void  LCD_CircleDraw (u32 X_Location, u32 Y_Location, u32 Radius) ; //画半径参数的圆         LCD_CircleDraw (50,50,50);                 LCD_CircleDraw (100,50,50);               LCD_CircleDraw (50,100,50); 以上三个输入坐标,只有第一个不察觉到,第二及第三的从标是Y,X的方向显示了。  2,void  LCD_LineDraw (u32 X_Location, u32 Y_Location, u32 Length, u32 Direction) ;//画线 LCD_LineDraw(0,0,100,0); LCD_LineDraw(100,0,100,0); LCD_LineDraw(0,100,100,0);   3,void  LCD_PicDraw (u8 X_Location, u16 Y_Location, u8 Height, u16 Width, uc8 *Pptr) ;//显示图片 4, void  LCD_RectDraw (u32 X_Location, u32 Y_Location, u32 Height, u32 Width) //画方框 这二个同样显示显示效果坐标同上二个一样,在此省略。 四,void  LCD_CircleDraw (u32 X_Location, u32 Y_Location, u32 Radius) ,存在严重的BUG。    1,当Radius输入为0时,存在以下二种情况。    2,不在while等循环体内,无法正常显示。屏幕没有显示,白色底图一张。 3,当在循环体内,显示杂乱,成一条条直线,直至布满整个屏幕。 4,进入LCD_CircleDraw函数内,代码如下: /*********************************************************************************************************//** * @brief Display a circle. * @param X_Location: specify the X position. * @param Y_Location: specify the Y position. * @param Radius: radius of the circle. * @retval None ***********************************************************************************************************/ void LCD_CircleDraw(u32 X_Location, u32 Y_Location, u32 Radius) { s32 DV; // Decision Variable u32 X_Value; // Current X Value u32 Y_Value; // Current Y Value DV = 3 - (Radius << 1); X_Value = 0; Y_Value = Radius; while (X_Value <= Y_Value) { LCD_StarterSet(X_Location + X_Value, Y_Location + Y_Value); LCD_WriteRAMWord(Color_Text); LCD_StarterSet(X_Location + X_Value, Y_Location - Y_Value); LCD_WriteRAMWord(Color_Text); LCD_StarterSet(X_Location - X_Value, Y_Location + Y_Value); LCD_WriteRAMWord(Color_Text); LCD_StarterSet(X_Location - X_Value, Y_Location - Y_Value); LCD_WriteRAMWord(Color_Text); LCD_StarterSet(X_Location + Y_Value, Y_Location + X_Value); LCD_WriteRAMWord(Color_Text); LCD_StarterSet(X_Location + Y_Value, Y_Location - X_Value); LCD_WriteRAMWord(Color_Text); LCD_StarterSet(X_Location - Y_Value, Y_Location + X_Value); LCD_WriteRAMWord(Color_Text); LCD_StarterSet(X_Location - Y_Value, Y_Location - X_Value); LCD_WriteRAMWord(Color_Text); if (DV < 0) { DV += (X_Value << 2) + 6; } else { DV += ((X_Value - Y_Value) << 2) + 10; Y_Value--; } X_Value++; } } 5,查看分析,发现是Y_Value--,没有先判断为是否为0。如果是0,执行后Y_Value的值等于 2^32 - 1 = 4294967295,一直不断循环执行下去。只要先判断不为0时,才能执行Y_Value--,这样才不会一直循环执行下去。修改代码如下: /*********************************************************************************************************//** * @brief Display a circle. * @param X_Location: specify the X position. * @param Y_Location: specify the Y position. * @param Radius: radius of the circle. * @retval None ***********************************************************************************************************/ void LCD_CircleDraw(u32 X_Location, u32 Y_Location, u32 Radius) { s32 DV; // Decision Variable u32 X_Value; // Current X Value u32 Y_Value; // Current Y Value DV = 3 - (Radius << 1); X_Value = 0; Y_Value = Radius; while (X_Value <= Y_Value) { LCD_StarterSet(X_Location + X_Value, Y_Location + Y_Value); LCD_WriteRAMWord(Color_Text); LCD_StarterSet(X_Location + X_Value, Y_Location - Y_Value); LCD_WriteRAMWord(Color_Text); LCD_StarterSet(X_Location - X_Value, Y_Location + Y_Value); LCD_WriteRAMWord(Color_Text); LCD_StarterSet(X_Location - X_Value, Y_Location - Y_Value); LCD_WriteRAMWord(Color_Text); LCD_StarterSet(X_Location + Y_Value, Y_Location + X_Value); LCD_WriteRAMWord(Color_Text); LCD_StarterSet(X_Location + Y_Value, Y_Location - X_Value); LCD_WriteRAMWord(Color_Text); LCD_StarterSet(X_Location - Y_Value, Y_Location + X_Value); LCD_WriteRAMWord(Color_Text); LCD_StarterSet(X_Location - Y_Value, Y_Location - X_Value); LCD_WriteRAMWord(Color_Text); if (DV < 0) { DV += (X_Value << 2) + 6; } else { DV += ((X_Value - Y_Value) << 2) + 10; if(Y_Value > 0){ //增加Y_Value非0判断 Y_Value--; } } X_Value++; } } 6,修正代码后运行正常,如下图。 五,建议逻辑正确性。    在进行加减法操作时,一定要加上判断及执行结果界限值,否则容易人为错误引入BUG。

  • 2020-08-09
  • 发表了主题帖: ESK32-360测评】+LCD测试

    本帖最后由 szkei 于 2020-8-10 00:44 编辑 一,LCD函数使用查找。 打开测评项目中的HT32F1xxxx_Programmer_Guide_v004_2103.chm帮助文件,在索引档中输入关键字“ebi_lcd.h”,弹出ebi_lcd.h的宏定义及方法。方法一共列出有21只。见下图所示。   二,测试函数选择。 本次测试用到的函数为:      1,void  LCD_Init (void); //LCD初始      2,void  LCD_Config (void);//LCD配置      3,void  LCD_DisplayOff (void) ;//显示关      4,void  LCD_DisplayOn (void);//显示开      5,void  LCD_BackColorSet (u16 Color) ;//line的背景颜色设置      6,void  LCD_TextColorSet (u16 Color) ;//字体颜色设置     7,void  LCD_StringLineDisplay (u32 Line_Num, char *Sptr) ;//line0的显示内容     8,void  LCD_CircleDraw (u32 X_Location, u32 Y_Location, u32 Radius) ; //画半径参数的圆     9,void  LCD_LineDraw (u32 X_Location, u32 Y_Location, u32 Length, u32 Direction) ;//画线    10,void  LCD_PicDraw (u8 X_Location, u16 Y_Location, u8 Height, u16 Width, uc8 *Pptr) ;//显示图片     11, void  LCD_RectDraw (u32 X_Location, u32 Y_Location, u32 Height, u32 Width) //画方框 三,代码实现。 1,main.c的内容如下: #include "ht32.h" #include "ht32_board.h" #include "ht32_board_config.h" #include "picture.h" u16 charx = 'x'; u16 x = 200,y =0,z=0; void SYS_LCD_Init(void); void LCD_Function(void); void Delay(u32 ms); int main(void){ SYS_LCD_Init(); while(1){ } } void SYS_LCD_Init(void){ LCD_Init(); //LCD初始 LCD_Config(); //LCD配置 LCD_DisplayOff(); //显示关 LCD_BackColorSet(Blue); //line的背景颜色设置 LCD_TextColorSet(Yellow); //字体颜色设置 LCD_StringLineDisplay(Line0," EEWorld and HOLTEK "); //line0的显示内容 LCD_TextColorSet(Blue); //字体颜色设置 LCD_CircleDraw(80,55,50); //画半径参数的圆 LCD_TextColorSet(Black); LCD_CircleDraw(80,160,50); LCD_TextColorSet(Red); LCD_CircleDraw(80,265,50); LCD_TextColorSet(Yellow); LCD_CircleDraw(130,105,50); LCD_TextColorSet(Green); LCD_CircleDraw(130,210,50); LCD_LineDraw(130,30,120,1); //画垂直线 LCD_PicDraw(185,120,48,100,HT32_Table); //显示图片 LCD_RectDraw(182,115,55,110); //画方框 LCD_DisplayOn(); //显示开 } void Delay(u32 ms){ do{ __NOP(); }while(ms--); } 2,显示效果说明。     a,第一行显示背景为蓝色,字体为黄色,内容为" EEWorld and HOLTEK "。     b,中间位置显示奥运五色环。     c,中间及底部在屏的前端显示一条竖线。    d,在底部显示一个绿色的方框,并且方框内嵌一张图片。 3,编译下载后,图片效果如下: 4,从图片上看到整个屏的底色为黑色,根本看不到完整的奥运五色环。 5,经查找发现到LCD_Config ()函数内有个专用清除屏的背景颜色函数LCD_Clear(Black),默认为黑色。将参数改为“White”后,重新编译下载后,图片显示出来效果如下: 6,图片显示正常,在此已运用以上11个函数完整地显示出想要的效果。 7,关于屏幕的显示方向可以在文件“lcd.h”的#define LCD_DIRECTION   (x)中设置,x为0-3。具体内容见截图,这次使用的方向为默认方向。所以x=0。   四,测评项目代码。 项目代码  

  • 2020-08-08
  • 加入了学习《【ESK32-360测评】+按键控件LED个数流水灯闪烁,并按键操作有提示音测评视频》,观看 【ESK32-360测评】+按键控件LED个数流水灯闪烁,并按键操作有提示音测评视频

  • 回复了主题帖: 【ESK32-360测评】+按键控件LED个数流水灯闪烁,并按键操作有提示音

    freebsder 发表于 2020-8-7 23:01 画的挺好看,看起来比其他xx,yy的板子做的细致得多。是一块“开发板”的长相了。
    有同感

  • 2020-08-07
  • 发表了主题帖: 【ESK32-360测评】+按键控件LED个数流水灯闪烁,并按键操作有提示音

    本帖最后由 szkei 于 2020-8-8 23:18 编辑  一,感言。                从2010年开始有所了解合泰,但因当时经济能力影响无法购买编程器,所以未能用上合泰。一晃10年过去,在7月份时来EEWROLD上转转,发现了合泰ESK32-360开发板进行测评活动,即时就申请了,结果EEWROLD给了我这次的机会,可以与合泰有个零距离的接触。当收到板子时,有种莫明的兴奋感,很想打开包装一见【ESK32-360开发板】真容,但还是自己定力足,等到回家才打开,结果出乎意料的是开发板由外到内的包装都是那么讲究,做到真材实料,这是EEWROLD及合泰工作人员对工作要求做到一丝不苟的良好结果。感谢EEWROLD及合泰的工作人员对体验者的关心。 二,【ESK32-360开发板】真容。         拆开包装后,被开发板的大块板吸引了,特别是开发板按照教科书的标准要求来Layout,顶层横画,底层竖画,丝印贴近元件封装,这是这么的专业。好的来上图一起见证。   三,测试目标及介绍。 每一个体验者大多数的情况下拿到开发板都是从点灯开始,这是每种MCU最基础的测试。从标题可以看出是按键来控制LED的个数流水灯闪烁。 1,wakeup键来控制一粒LED灯的闪烁。 2,key1控制二粒灯的闪烁。 3,key2按制三料的闪烁。 4,开始上电是所有LED处于OFF状态。   四,keil5环境搭建及功能实现。 1,建立环境,因为合泰单片机资料相对于其它的比较少,所以只能用这次测评给出的例程进行移植。 2,解压随附的“HT32_STD_1xxxx_FWLib_v004_2103.zip”压缩包。将文件夹“HT32_STD_1xxxx_FWLib_v004_2103”改为“EEWORLD_HT32F1654_TEST__LED+BUZZER”。后打开到..\project_template\IP\Example,将maic.c文件给删除。再打开文件夹MDK_ARMv5双击Project_1654.uvprojx。 3,打开keil5软件后,在左边项目栏的User下重新新建一个main.c文件,并如下添加头文件 #include "ht32.h" #include "ht32_board.h" #include "ht32_board_config.h" 4,建立此标题所需要如下函数。 5,关于端口初始化,合泰给出了简单实用的函数,详细请参阅例程中的HT32F1xxxx_Programmer_Guide_v004_2103.chm文件,查找下图的位置,查看Functions下的方法函数。 6,这次测试只是用到以下7个函数: void  HT32F_DVB_LEDInit (LED_TypeDef HT_LEDn);//LED初始化 void  HT32F_DVB_LEDOn (LED_TypeDef HT_LEDn) ;//LED开 void  HT32F_DVB_LEDOff (LED_TypeDef HT_LEDn) ;//LED关 void  HT32F_DVB_PBInit (BUTTON_TypeDef BUTTON_x, BUTTON_MODE_TypeDef BUTTON_MODE_x) ; //按键初始化 u32  HT32F_DVB_PBGetState (BUTTON_TypeDef BUTTON_x) ;//获得键的状态 void  HT32F_DVB_BuzzerFun (u16 hFreq, u8 bDuty, u32 mode) ;//蜂鸣器初始化 void  HT32F_DVB_BuzzerOutputCmd (ControlStatus Control) ;//蜂鸣器使能 每一个函数有详细的阐释,值得其它软件人员阅览此使用帮助文档,会给到一份意想不到的收获效果,就当是一种自我交流提升手册。 7,具体实现代码如下: 按下键时,蜂鸣器会报音一次,要释放按键再重新按下才才再次报音。 #include "ht32.h" #include "ht32_board.h" #include "ht32_board_config.h" u8 led_show_amount_value = 0; //led显示数量值 u8 forx = 0; //循环显示 bool key_down_flag = FALSE; //按键按下状态 void LED_Init(void); void LED_Function(void); void SET_LED_SHOW_COUNT(void); void Delay(u32 clock); int main(void){ LED_Init(); while(1){ LED_Function(); } } void LED_Init(void){ /* LED初始化 */ HT32F_DVB_LEDInit(HT_LED1); HT32F_DVB_LEDInit(HT_LED2); HT32F_DVB_LEDInit(HT_LED3); /* 按键初始化 */ HT32F_DVB_PBInit(BUTTON_WAKEUP,BUTTON_MODE_GPIO); HT32F_DVB_PBInit(BUTTON_KEY1,BUTTON_MODE_GPIO); HT32F_DVB_PBInit(BUTTON_KEY2,BUTTON_MODE_GPIO); /* LED状态关闭 */ HT32F_DVB_LEDOff(HT_LED1); HT32F_DVB_LEDOff(HT_LED2); HT32F_DVB_LEDOff(HT_LED3); HT32F_DVB_BuzzerFun(2400,50,0); //蜂鸣器初始化 } void SET_LED_SHOW_COUNT(void){ if(HT32F_DVB_PBGetState(BUTTON_WAKEUP) == SET){ if(!key_down_flag){ HT32F_DVB_BuzzerOutputCmd(ENABLE); //使能蜂鸣器 key_down_flag = TRUE; }else{ HT32F_DVB_BuzzerOutputCmd(DISABLE); //禁止使能蜂鸣器 } led_show_amount_value = 1; }else if(HT32F_DVB_PBGetState(BUTTON_KEY1) == RESET){ if(!key_down_flag){ HT32F_DVB_BuzzerOutputCmd(ENABLE); key_down_flag = TRUE; }else{ HT32F_DVB_BuzzerOutputCmd(DISABLE); //禁止使能蜂鸣器 } led_show_amount_value = 2; }else if(HT32F_DVB_PBGetState(BUTTON_KEY2) == RESET){ if(!key_down_flag){ HT32F_DVB_BuzzerOutputCmd(ENABLE); key_down_flag = TRUE; }else{ HT32F_DVB_BuzzerOutputCmd(DISABLE); //禁止使能蜂鸣器 } led_show_amount_value = 3; }else if(key_down_flag){ HT32F_DVB_BuzzerOutputCmd(DISABLE); //禁止使能蜂鸣器 key_down_flag = FALSE; } } void Delay(u32 clock){ do{ __NOP(); }while(clock--); } void LED_Function(void){ SET_LED_SHOW_COUNT(); for(forx = 0;forx < led_show_amount_value;forx++){ Delay(3000000); SET_LED_SHOW_COUNT(); HT32F_DVB_LEDOn((LED_TypeDef)forx); Delay(3000000); SET_LED_SHOW_COUNT(); HT32F_DVB_LEDOff((LED_TypeDef)forx); } } 五,用后感想。         对于官方给出这几个函数,给一些不了解硬件的软件工程师来讲无疑是一种福音。点击代码HT_LED1选择去定义会弹出ht32f1654_dvb.h。在此文件中可以修改想要的端口从而实现此端口快速定义及使用,这样会给开发者带来质的速度及代码质量,会减少好多其它由于个人编写的未知BUG。 六,视频及整个测试项目原代码。 视频地址http://training.eeworld.com.cn/course/5749/learn?preview=1#lesson/26888 原代码

  • 2020-07-23
  • 回复了主题帖: 【测评入选名单公布】合泰ESK-360开发板测评

    个人信息已确认,确定可以按时完成测评

最近访客

< 1/1 >

统计信息

已有29人来访过

  • 芯币:15
  • 好友:--
  • 主题:3
  • 回复:2
  • 课时:1
  • 资源:--

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言