wadeRen

  • 2022-06-24
  • 回复了主题帖: 每个电子工程师都应该有一本的免费引脚电子书(The Pinouts Book)

    棒。

  • 2022-06-21
  • 回复了主题帖: hi,小伙伴们!这里有棵测评许愿树

    i.MX6ULL系列的开发板。

  • 2022-04-04
  • 回复了主题帖: GD32L233C-START评测——08.桌面时钟——综合Demo1

    Jacktang 发表于 2022-4-4 09:15 整理了测评系列,已经关注望继续
    谢谢关注。会继续的

  • 2022-04-03
  • 发表了主题帖: GD32L233C-START评测——08.桌面时钟——综合Demo1

    本帖最后由 wadeRen 于 2022-4-3 20:21 编辑 [TOC] # [文章导航] [GD32L233C-START评测——01.开箱、开发包](http://bbs.eeworld.com.cn/thread-1192154-1-1.html) [GD32L233C-START评测——02_1.搭建开发环境、简单调试](http://bbs.eeworld.com.cn/thread-1192468-1-1.html) [GD32L233C-START评测——02_2.搭建开发环境、简单调试](http://bbs.eeworld.com.cn/thread-1192590-1-1.html) [GD32L233C-START评测——03_1.CoreMark测试、RT-Thread-Nano移植](http://bbs.eeworld.com.cn/thread-1192720-1-1.html) [GD32L233C-START评测——03_2.CoreMark测试、RT-Thread-Nano移植](http://bbs.eeworld.com.cn/thread-1192961-1-1.html) [GD32L233C-START评测——04.模拟IIC与硬件IIC驱动OLED对比](http://bbs.eeworld.com.cn/thread-1193138-1-1.html) [GD32L233C-START评测——05.SPI测试——驱动TFT屏 ](http://bbs.eeworld.com.cn/thread-1194245-1-1.html) [GD32L233C-START评测——06.LPUART+DMA+MCU睡眠唤醒——综合试验1](http://bbs.eeworld.com.cn/thread-1194916-1-1.html) [GD32L233C-START评测——07.RTC+SPI墨水屏显示时间——综合试验2](http://bbs.eeworld.com.cn/thread-1197479-1-1.html) # 前言 - 综合Demo来了。 - 简单分享综合Demo的硬件框架,已经打了电路板,在路上。 # 1、 功能 - [ ] 1. 时间显示:公历、农历显示;时、分显示;秒显示可调。 - [ ] 2. 时间设置:按键设置时间。 - [ ] 3. 温湿度显示:温度精确到0.1℃,湿度精确到1%RH;刷新时间固定。 - [ ] 4. 闹钟:时间可设置;提醒次数可设置。 - [ ] 5. 番茄钟。 - [ ] 6. 电池电量检测、显示。 - [ ] 7. 通过NB模块,连接NTP获取时间。(暂时没有做) # 2、Demo框图 # 3、框图介绍 ## 3.1、 框图内的外设 - PWM:驱动蜂鸣器、LED和扁平马达。 - SPI:驱动墨水屏和NORFlash。 - IIC:驱动温湿度传感器SHT31。 - GPIO:供电开关、按键。 - USART:打印调试信息。 ## 3.2、无法体现在框图内的外设 - RTC - PMU - EXTI - ADC - FWDGT # 4、 原理图 ## 4.1 power ## 4.2 mcu ## 4.3 other # 5、 3D模型图 # 5、工程开源地址 [立创开源平台](https://oshwhub.com/wadeRen/546f22622c1a49ad913cce0f88d0e932) > 进入链接后在头像的右上角选**编辑器打开**即可查看到。 # 结语 - 当前板子正在打样,还没回来。元器件也正在路上,所以只能看个图片解解渴了。 - 下篇展示功能演示。 - 下下篇就是整板的效果。感兴趣的童鞋可以插眼蹲一下。

  • 2022-03-24
  • 回复了主题帖: GD32L233C-START评测——07.RTC+SPI墨水屏显示时间——综合试验2

    lugl4313820 发表于 2022-3-23 15:58 我买的2.1寸的几块钱吧,4.2的好象贵一点,一直吃灰中。。。
    难受~~~ 我这个一个2.9寸的,60+。贵了十几倍噢。我giao、

  • 回复了主题帖: GD32L233C-START评测——07.RTC+SPI墨水屏显示时间——综合试验2

    jiande1 发表于 2022-3-23 21:39 GD32L233C单片机用什么开发环境,没有用过,以前用STM32F4-7系列,用STM32CUBEIDE开发挺容易。
    是Keil,也不复杂。你可以下载我上传的工程源码来看看,也简单的很。

  • 回复了主题帖: GD32L233C-START评测——07.RTC+SPI墨水屏显示时间——综合试验2

    lugl4313820 发表于 2022-3-23 11:22 我在某鱼上买了N个,就是全刷一闪一闪就不爽,局刷又会出现乱码,还没有时间来整理。希望楼主继续完善,做 ...
    你看,我的局刷没问题呢,我尝试了一下你说的乱码问题,在显示之前有一个“清除窗口”的操作,你要给它清除足够大的地方,就能正常局刷。 比如说,我这里显示时间用了8个字符,7个字符的宽度(两个冒号占一个1字符的宽度 )。在填充时间数据的函数前,要清除出来“字符高度*7个字符宽度”的空间,再填充显示数据。 代码如下: /*清除空间*/ Paint_ClearWindows(5, 55, 5 + Font40.Width * 7, 55 + Font40.Height, WHITE); /*填充数据*/ Paint_DrawTime(5, 55, &sPaint_time, &Font40, WHITE, BLACK); /*显示*/ EPD_2IN9_V2_Display_Partial(BlackImage); 效果图如下:

  • 2022-03-23
  • 回复了主题帖: GD32L233C-START评测——07.RTC+SPI墨水屏显示时间——综合试验2

    lugl4313820 发表于 2022-3-23 11:22 我在某鱼上买了N个,就是全刷一闪一闪就不爽,局刷又会出现乱码,还没有时间来整理。希望楼主继续完善,做 ...
    另,弱弱的问一下某鱼买的,价格是多少啊??我这买的好贵啊,60+。

  • 回复了主题帖: GD32L233C-START评测——07.RTC+SPI墨水屏显示时间——综合试验2

    lugl4313820 发表于 2022-3-23 11:22 我在某鱼上买了N个,就是全刷一闪一闪就不爽,局刷又会出现乱码,还没有时间来整理。希望楼主继续完善,做 ...
    我的局刷试了下问题不大,但有时候也会出现乱码,有时候不会,我晚上可以改完放上来给你看。

  • 回复了主题帖: GD32L233C-START评测——07.RTC+SPI墨水屏显示时间——综合试验2

    Jacktang 发表于 2022-3-23 07:24 厉害了,墨水屏再贵也要买一个,为了试验测评
    哈哈,本来也挺有兴趣的,就买来了。

  • 2022-03-22
  • 发表了主题帖: GD32L233C-START评测——07.RTC+SPI墨水屏显示时间——综合试验2

    本帖最后由 wadeRen 于 2022-3-22 22:41 编辑 [TOC] # [文章导航] [GD32L233C-START评测——01.开箱、开发包](http://bbs.eeworld.com.cn/thread-1192154-1-1.html) [GD32L233C-START评测——02_1.搭建开发环境、简单调试](http://bbs.eeworld.com.cn/thread-1192468-1-1.html) [GD32L233C-START评测——02_2.搭建开发环境、简单调试](http://bbs.eeworld.com.cn/thread-1192590-1-1.html) [GD32L233C-START评测——03_1.CoreMark测试、RT-Thread-Nano移植](http://bbs.eeworld.com.cn/thread-1192720-1-1.html) [GD32L233C-START评测——03_2.CoreMark测试、RT-Thread-Nano移植](http://bbs.eeworld.com.cn/thread-1192961-1-1.html) [GD32L233C-START评测——04.模拟IIC与硬件IIC驱动OLED对比](http://bbs.eeworld.com.cn/thread-1193138-1-1.html) [GD32L233C-START评测——05.SPI测试——驱动TFT屏 ](http://bbs.eeworld.com.cn/thread-1194245-1-1.html) [GD32L233C-START评测——06.LPUART+DMA+MCU睡眠唤醒——综合试验1](http://bbs.eeworld.com.cn/thread-1194916-1-1.html) # 前言 - 距离上一篇评测隔了挺长时间,不过本篇又是一个综合测试。 - 最近项目太忙,断更了一段时间,现在恢复。并把前面欠下的抓紧补上。 - 做本篇测试的目的,为了完结前面第五篇的遗留([链接](http://bbs.eeworld.com.cn/thread-1194245-1-1.html)),也是为了后面的综合项目趟坑。 # 1、外设简介 ## 1.1、RTC简介 简单理解,RTC就是一个定时器,不过是专门用作记录时间的(年月日时分秒)。 比较关键的点是,RTC可以工作在省电模式,通过合适的硬件设计即可在主时钟停掉时继续计时,回到正常运行模式后,时间也正常。 ## 1.2、SPI简介 > 大家都知道,就不再啰嗦了。只是我们用到的是非四线制的常规模式。 ## 1.3、墨水屏 > 这个可得好好说说了。 墨水屏,也叫水墨屏,有些地方也叫电子纸。最大的特点是: - 显示效果类似白纸黑字; - 掉电后可保持显示; - **低功耗**(刷新时只有mW级别的功耗,不刷新时几乎零功耗); 为了与咱们MCU主打的**低功耗**保持一致,故买了一个2.9寸墨水屏(好贵),来作为这个评测内容的一部分,以及综合项目也是基于这个墨水屏设计的。 # 2、试验内容说明 目标:**在墨水屏上显示RTC记录的当前时间。** 墨水屏介绍:2.9寸黑白双色;可局刷;分辨率296x128;灰度等级2。 硬件平台:GD32L233C-START开发板+自制墨水屏转接板。 关键外设:RTC、SPI。 连接说明:RST—PB7、DC—PB8、BUSY—PB9、SPI_CS—PB12、SPI_CLK—PB13、SPI_MOSI—PB15、SPI_MISO—PB14。 模式说明:因为墨水屏仅需接收MCU给其的显示数据,无需返回数据给MCU,所以我们仅需实现SPI为**发送**即可。 **另:** 为了驱动墨水屏,特意制作了一块转接板。 # 3、外设初始化 ## 3.1、RTC初始化 > 本次测试里只是用了日历功能,未使用闹钟和侵入检测等功能,故初始化较为简单。 ```c void bsp_rtc_config(void) {     /*使用外部32.768K时钟*/         rcu_osci_on(RCU_LXTAL);         rcu_osci_stab_wait(RCU_LXTAL);         rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);         prescaler_s = 0xFF;         prescaler_a = 0x7F;                 rcu_periph_clock_enable(RCU_RTC);         rtc_register_sync_wait(); } ``` **注意:** 此处使用了外部的32.768K晶振,因为经过实际测试,使用内部的时钟,每分钟有5S左右的误差。 ## 3.2、SPI初始化 SPI的初始化与[GD32L233C-START评测——05.SPI测试——驱动TFT屏](http://bbs.eeworld.com.cn/thread-1194245-1-1.html)的SPI初始化相同,不再啰嗦。 ## 3.3、SPI写字节 同上,参考[GD32L233C-START评测——05.SPI测试——驱动TFT屏](http://bbs.eeworld.com.cn/thread-1194245-1-1.html)。 # 4、其它 宏定义GPIO读写: ```c #define DEV_Digital_Write(_pin, _value) gpio_bit_write(_pin, _value == 0? RESET:SET) #define DEV_Digital_Read(_pin) gpio_input_bit_get(_pin) ``` ---- 至此,墨水屏相关的基础代码介绍完毕。RTC部分参考例程,先输入时间,再进行显示。 # 5、主函数 主函数代码如下: ```c int main(void) {     systick_config();               led_init();             gd_eval_com_init(EVAL_COM);    //初始化串口O             led_flash(1);    //所有LED亮400ms,灭400ms             /* enable PMU and BKP clock */     rcu_periph_clock_enable(RCU_PMU);     rcu_periph_clock_enable(RCU_BKP);     /* enable the access of the RTC registers */     pmu_backup_write_enable();     bsp_rtc_config();             /*编译下载代码时不屏蔽此行,即可重新设置时间*/ //  RTC_BKP0 = 0;                /* check if RTC has aready been configured */     if(BKP_VALUE != RTC_BKP0) {                     rtc_setup();     } else {         /* detect the reset source */         if(RESET != rcu_flag_get(RCU_FLAG_PORRST)) {             printf("power on reset occurred....\n\r");         } else if(RESET != rcu_flag_get(RCU_FLAG_EPRST)) {             printf("external reset occurred....\n\r");         }         printf("no need to configure RTC....\n\r");         rtc_show_time();     }     rcu_all_reset_flag_clear();             MX_GPIO_Init();             MX_SPI1_Init();     while(1)         {         printf("123\r\n");         display_application();     } } ``` # 6、效果 > 说明: >  1.上电后在串口工具中输入时间,年月日时分秒; >  2.墨水屏开始刷新并依次显示,兆易创新LOGO、电子工程世界LOGO、输入的时间; >  3.此后屏幕`DC`下拉,关闭供电; >  4.每隔一分钟时间刷新一次。 # 总结 - 墨水屏的坑太多了,也是因为我第一次用,所以用的非常纠结。尤其是字体取模和BMP图取模时。 - MCU片内的低速时钟精度太低了,不适合做时间显示类的应用。 - RTC外设在这个试验中仅仅用了一小部分,后面的综合项目会逐渐融入RTC的其它功能。 - 此次试验中部分功能未完全实现,比如农历的年月日及周几,并未实现,而是固定显示这个的。后面会完善。 # 结语 - 本次试验测试了两个外设(其实仅RTC一个),比较新奇的是墨水屏,我对它的显示效果很满意,对它宣传的低功耗也很期待。 - 以上内容若有错误,请不吝赐教。我这厢有礼了~:Onion-45: - 开源的综合试验项目已经有了方向和初步的想法,下篇公布。 - 后续会穿插外设测试和试验项目。 > 另:附件上传工程源码和转接板光绘文件。附件说明如下: > > 15-GD32L233CCT6-Test.zip:LPUART发送接收+DMA传输+LPUART接收唤醒MCU。 > artwork_pinBoard_V0.1.zip:24pin 0.5mm FPC接口墨水屏转接板。

  • 2022-03-01
  • 回复了主题帖: 【GD32L233C-START评测】二 开发板功能评测

    很nice,蹲一个后续。

  • 2022-02-25
  • 回复了主题帖: rtthread真的有工业产品在大规模的用?

    而且,我觉得他们给的各种各样的外设驱动,美其名曰缩短开发周期,其实并不是能直接用的,用来快速实现功能还行,但直接上项目还是不放心的。

  • 回复了主题帖: rtthread真的有工业产品在大规模的用?

    哈哈,老哥呀,我没用过他们家的驱动配置,只用它极简内核,其他硬件驱动都是自己写,在裸机跑没问题了,再集成到系统中。因为用他家给的硬件驱动总感觉不靠谱,毕竟较为底层的东西还是亲手搭建比较放心。

  • 发表了主题帖: GD32L233C-START评测——06.LPUART+DMA+MCU睡眠唤醒——综合试验1

    本帖最后由 wadeRen 于 2022-2-25 10:14 编辑 # [文章导航] [GD32L233C-START评测——01.开箱、开发包](http://bbs.eeworld.com.cn/thread-1192154-1-1.html) [GD32L233C-START评测——02_1.搭建开发环境、简单调试](http://bbs.eeworld.com.cn/thread-1192468-1-1.html) [GD32L233C-START评测——02_2.搭建开发环境、简单调试](http://bbs.eeworld.com.cn/thread-1192590-1-1.html) [GD32L233C-START评测——03_1.CoreMark测试、RT-Thread-Nano移植](http://bbs.eeworld.com.cn/thread-1192720-1-1.html) [GD32L233C-START评测——03_2.CoreMark测试、RT-Thread-Nano移植](http://bbs.eeworld.com.cn/thread-1192961-1-1.html) [GD32L233C-START评测——04.模拟IIC与硬件IIC驱动OLED对比](http://bbs.eeworld.com.cn/thread-1193138-1-1.html) [GD32L233C-START评测——05.SPI测试——驱动TFT屏](http://bbs.eeworld.com.cn/thread-1194245-1-1.html) # 前言 - 距离上一篇评测隔了挺长时间,不过本篇是一个综合测试。 - 本篇仅仅是为了测试外设,代码比较简单,实现的功能也较为简单。 - 做本篇综合试验的目的,也是为了后面的实践项目趟坑。 # 1、外设简介 ## 1.1、LPUART简介 在UART前加入了“LP”,可在睡眠模式下运行,即为低功耗通用异步收发器。还支持硬件流控(CTS/RTS)。最最关键的部分**LPUART_TX、LPUART_RX可以配置**,换句话说,如果引脚紧张则**收/发功能可以用一个引脚来实现**(这点对我来说很新颖)。 ## 1.2、DMA简介 **代替CPU做数据搬运的搬运工。** 这是我对这个外设的基本认识。 代替CPU实现搬运工作(如:搬运图片数据),即可把CPU空闲出来做逻辑处理的工作;通过合适的设置后,CPU仅需判断传输是否完成就行了。在多任务的系统里(如:前后台系统或者RTOS),可以极大的提高CPU的利用率。 >打个比方,CPU是一个将军,DMA就是他的传令兵。将军在指挥部纵观全局指挥战斗,那他下达命令到战斗部队有两种方式:1、亲自去战斗部队去传令;2、让传令兵代替他去给战斗部队传令。那肯定是后一种方式更棒嘛,将军不要去干这种简单的、耗时的工作。 # 2、试验内容说明 目标:**在MCU处于睡眠模式下通过向LPUART发送数据来唤醒MCU,并将接收到的数据发送出来。** 硬件平台:GD32L233C-START开发板。 关键外设:LPUART、DMA。 连接说明:PA2(LPUART_TX)连接串口工具RXD、PA3(LPUART_RX)连接串口工具TXD、GND。 # 3、外设初始化 初始化LPUART、DMA。 ## 3.1 LPUART初始化 **LPUART发送器**配置流程如下: > 图片截取自《GD32L23x_yonghushouce_Rev1.0.pdf》——P416。 **LPUART接收器**配置流程如下: > 图片截取自《GD32L23x_yonghushouce_Rev1.0.pdf》——P417。 LPUART初始化代码如下: ```c void com_lpuart_init(void) {     /* enable COM GPIO clock */     rcu_periph_clock_enable(RCU_GPIOA);     /* enable LPUART clock */     rcu_periph_clock_enable(RCU_LPUART);     /* connect port to LPUART TX */     gpio_af_set(GPIOA, GPIO_AF_8, GPIO_PIN_2);     /* connect port to LPUART RX */     gpio_af_set(GPIOA, GPIO_AF_8, GPIO_PIN_3);     /* configure LPUART TX as alternate function push-pull */     gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_2);     gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_2);     /* configure LPUART RX as alternate function push-pull */     gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_3);     gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_3);     /* LPUART configure */     lpuart_deinit();     lpuart_word_length_set(LPUART_WL_8BIT);     lpuart_stop_bit_set(LPUART_STB_1BIT);     lpuart_parity_config(LPUART_PM_NONE);     lpuart_baudrate_set(115200U);     lpuart_receive_config(LPUART_RECEIVE_ENABLE);     lpuart_transmit_config(LPUART_TRANSMIT_ENABLE);     lpuart_enable(); } ``` ## 3.2 DMA初始化 **DMA实现LPUART发送**配置流程如下: > 图片截取自《GD32L23x_yonghushouce_Rev1.0.pdf》——P418。 **DMA实现LPUART接收**配置流程如下: > 图片截取自《GD32L23x_yonghushouce_Rev1.0.pdf》——P419。 DMA初始化代码如下: ```c void com_dma_lpuart_init(void) {     dma_parameter_struct dma_init_struct;     /* enable DMA clock */     rcu_periph_clock_enable(RCU_DMA);     /*configure DMA interrupt*/     nvic_irq_enable(DMA_Channel0_IRQn, 0);     nvic_irq_enable(DMA_Channel1_IRQn, 0);         /**********配置LPUART_TX到DMA_CH0********/     /* initialize DMA channel 0 */     dma_deinit(DMA_CH0);     dma_struct_para_init(&dma_init_struct);     dma_init_struct.request      = DMA_REQUEST_LPUART_TX;     dma_init_struct.direction    = DMA_MEMORY_TO_PERIPHERAL;     dma_init_struct.memory_addr  = (uint32_t)txbuffer;     dma_init_struct.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;     dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;     dma_init_struct.number       = ARRAYNUM(txbuffer);     dma_init_struct.periph_addr  = (uint32_t)LPUART_TDATA_ADDRESS;     dma_init_struct.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;     dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;     dma_init_struct.priority     = DMA_PRIORITY_ULTRA_HIGH;     dma_init(DMA_CH0, &dma_init_struct);     /* configure DMA mode */     dma_circulation_disable(DMA_CH0);     dma_memory_to_memory_disable(DMA_CH0);     /* disable the DMAMUX_MUXCH0 synchronization mode */     dmamux_synchronization_disable(DMAMUX_MUXCH0);     /* LPUART DMA enable for transmission and reception */     lpuart_dma_transmit_config(LPUART_DENT_ENABLE);     /* enable DMA channel 0 transfer complete interrupt */     dma_interrupt_enable(DMA_CH0, DMA_INT_FTF);         //   此处暂不使能DMA_CH0,即暂不使能发送     /* enable DMA channel 0 */ //  dma_channel_enable(DMA_CH0); /**********配置LPUART_RX到DMA_CH1********/     /* initialize DMA channel 1 */     dma_deinit(DMA_CH1);     dma_struct_para_init(&dma_init_struct);     dma_init_struct.request      = DMA_REQUEST_LPUART_RX;     dma_init_struct.direction    = DMA_PERIPHERAL_TO_MEMORY;     dma_init_struct.memory_addr  = (uint32_t)rxbuffer;     dma_init_struct.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;     dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;     dma_init_struct.number       = ARRAYNUM(rxbuffer);     dma_init_struct.periph_addr  = (uint32_t)LPUART_RDATA_ADDRESS;     dma_init_struct.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;     dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;     dma_init_struct.priority     = DMA_PRIORITY_ULTRA_HIGH;     dma_init(DMA_CH1, &dma_init_struct);             /* configure DMA mode */     dma_circulation_disable(DMA_CH1);     dma_memory_to_memory_disable(DMA_CH1);     /* disable the DMAMUX_MUXCH1 synchronization mode */     dmamux_synchronization_disable(DMAMUX_MUXCH1);     /* LPUART DMA enable for reception */     lpuart_dma_receive_config(LPUART_DENR_ENABLE);     /* enable DMA channel 1 transfer complete interrupt */     dma_interrupt_enable(DMA_CH1, DMA_INT_FTF);     /* enable DMA channel 1 */     dma_channel_enable(DMA_CH1);             printf("\n\rDMA通道1初始化完成!\n\r"); } ``` > 此处不对`DMA_CH0`通道进行使能,因为使能后即会进行一次发送,但此时发送buffer为空,无有效数据。 # 4、中断函数 本次试验中用到了**LPUART接收中断**、**LPUART发送DMA完成中断**、**LPUART接收DMA完成中断**。 实现代码如下: ```c void LPUART_WKUP_IRQHandler(void) {     if(SET == lpuart_interrupt_flag_get(LPUART_INT_FLAG_WU))     {         lpuart_flag_clear(LPUART_FLAG_WU);         counter0 = 0x01;         exti_flag_clear(EXTI_28);     } } void DMA_Channel0_IRQHandler(void) {     if(RESET != dma_interrupt_flag_get(DMA_CH0, DMA_INT_FLAG_FTF))     {         dma_interrupt_flag_clear(DMA_CH0, DMA_INT_FLAG_G);         g_transfer_complete = SET;     } } void DMA_Channel1_IRQHandler(void) {     if(RESET != dma_interrupt_flag_get(DMA_CH1, DMA_INT_FLAG_FTF))     {         dma_interrupt_flag_clear(DMA_CH1, DMA_INT_FLAG_G);         g_transfer_complete = SET;     } } ``` # 5、重写打印函数 将`printf()`函数使用**LPUART**实现,实现代码如下: ```c int fputc(int ch, FILE *f) {         lpuart_data_transmit((uint8_t) ch );                         //发送字符         while (lpuart_flag_get(LPUART_FLAG_TC) == RESET);   //检查是否发送完毕         return (ch); } ``` # 6、主函数 主函数代码如下: ```c int main(void) {     uint8_t i;     systick_config();             led_init();             led_flash(1);    //所有LED亮400ms,灭400ms;执行1次             rcu_lpuart_clock_config(RCU_LPUARTSRC_IRC16MDIV);  //LPUART运行时钟配置             com_lpuart_init();    //初始化LPUART     printf("\n\rLPUART基本配置完成!\n\r");             nvic_irq_enable(LPUART_WKUP_IRQn, 0);        exti_init(EXTI_28, EXTI_INTERRUPT, EXTI_TRIG_RISING);             /* use start bit wakeup MCU */     lpuart_wakeup_mode_config(LPUART_WUM_STARTB);     lpuart_enable();             com_dma_lpuart_init();    //LPUART使用DMA初始化             lpuart_wakeup_enable();     lpuart_interrupt_enable(LPUART_INT_WU);             printf("\n\rMCU进入睡眠模式!\n\r");     rcu_periph_clock_enable(RCU_PMU);    //使能PMU时钟     pmu_to_deepsleepmode(PMU_LDNPDSP_LOWDRIVE, WFI_CMD, PMU_DEEPSLEEP);   //进入睡眠模式             /* wait a WUIE interrupt event */     while(0x00 == counter0)     {     }    //等待睡眠模式结束             printf("\n\rMCU退出睡眠模式!\n\r");     while(RESET == lpuart_flag_get(LPUART_FLAG_RBNE)) {     }     while(RESET == lpuart_flag_get(LPUART_FLAG_TC)) {     }     system_clock_reconfig();     systick_config();    //重新配置系统时钟             led_flash(2);    //所有LED亮400ms,灭400ms;执行两次             for(i = 0; i < 10; i++)        {         txbuffer = rxbuffer;   //将接收到的10个数据复制到发送buffer     }         dma_channel_enable(DMA_CH0);    //使能LPUART用DMA发送     //此处会进行一次发送,即LPUART_TX通过DMA的方式发送     while(1)     {     } } ``` # 7、效果 > 说明: > 1.接收buffer大小固定为10字节,所以多发送的不会保存。 > 2.MCU退出睡眠模式后有2s延时(此延时执行了亮灯)后才启动发送。 # 总结 - 在睡眠模式下LPUART依然可以通过接收中断的方式将MCU唤醒。 - 在睡眠模式下LPUART接收到的数据并不会因为触发接收中断而丢失。 - DMA这个外设很方便,在传输的过程中,尤其是大数据量传输的过程中,可节省大量CPU的时间。而使用如此方便的外设,仅需对其通道进行一次使能即可。 # 结语 - 本次试验测试了两个外设,并初步使用了一下低功耗模式(即睡眠模式),比想象中的简单。 - 以上内容若有错误,请不吝赐教。我这厢有礼了~:Onion-93: - **可以考虑规划综合试验及开源实践项目了,各位有什么想做的或者认为基于此芯片为核心实现什么项目,请留言一下。** - 下节继续测试外设或发项目初步规划。 > 另:附件上传工程源码。附件说明如下: > > **14-GD32L233CCT6-Test.zip**:LPUART发送接收+DMA传输+LPUART接收唤醒MCU。

  • 2022-02-24
  • 回复了主题帖: GD32L233C-START 开发板 学习笔记(五) 

    单片机的程序你也得给烧成USB的例程。

  • 2022-02-23
  • 回复了主题帖: 【GD32L233C-START评测】一 开箱

    1. 你的带盒的包装让我很酸。 2. 赞同你说的,布板子感觉不太讲究(反正连上就能用)。

  • 2022-02-18
  • 回复了主题帖: GD32L233C-START评测——05.SPI测试——驱动TFT屏

    Jacktang 发表于 2022-2-18 07:20 如用墨水屏应该比TFT屏省电的 期待楼主的MCU外设测试
    是的嘞。墨水屏刷屏的时候功耗不到20mW,比TFT屏省电多了。 期待您下篇贴的留言。

  • 回复了主题帖: 【GD32L233C-START评测】番外1 下载故障的解决

    这么干的目的应该是给有需要限制RAM大小的用途吧。比如说aRAM用来干这个事,bRAM用来干那个事。类似于在“Target”栏里指定ROM大小一样。你改为0x2000后还是比实际小的。

  • 2022-02-17
  • 发表了主题帖: GD32L233C-START评测——05.SPI测试——驱动TFT屏

    本帖最后由 wadeRen 于 2022-2-17 22:32 编辑 # GD32L233C-START评测——05.SPI测试—驱动TFT屏 # [文章导航] [GD32L233C-START评测——01.开箱、开发包](http://bbs.eeworld.com.cn/thread-1192154-1-1.html) [GD32L233C-START评测——02_1.搭建开发环境、简单调试](http://bbs.eeworld.com.cn/thread-1192468-1-1.html) [GD32L233C-START评测——02_2.搭建开发环境、简单调试](http://bbs.eeworld.com.cn/thread-1192590-1-1.html) [GD32L233C-START评测——03_1.CoreMark测试、RT-Thread-Nano移植](http://bbs.eeworld.com.cn/thread-1192720-1-1.html) [GD32L233C-START评测——03_2.CoreMark测试、RT-Thread-Nano移植](http://bbs.eeworld.com.cn/thread-1192961-1-1.html) [GD32L233C-START评测——04.模拟IIC与硬件IIC驱动OLED对比](http://bbs.eeworld.com.cn/thread-1193138-1-1.html "GD32L233C-START评测——04.模拟IIC与硬件IIC驱动OLED对比") # 前言 - 没出正月都在年里,给大家拜个晚年,祝大家晚年幸福:Onion-96:~ - 这篇耽搁了许久,本来不准备发的(原因后面说),但想到主要是评测开发板,所以还是发出来了。 - 这篇代码基本是移植过来的,将将实现功能,有很多坑。无法拿来在正式项目中使用。    # 1、SPI简介 大家都知道,SPI一般由NSS、SCK、MOSI、MISO共四根数据线构成(非四线制SPI)。 有部分数据手册将MOSI更名为SDO,MISO更名为SDI。 此处有篇文章讲了下为什么更名([SPI信号名称的新定义](https://oshwhub.com/article/a-resolution-to-redefine-spi-signal-names "SPI信号名称的新定义"))我不评论他/她写的内容是否对,我们仅仅是知道了有这样一个命名方式就好了。 下面简述驱动TFT屏的过程。 # 2、试验内容说明 目标:**正常驱动TFT屏显示照片**。 TFT屏介绍:4.0寸彩色;驱动芯片ST7796S;分辨率480x320。 硬件平台:GD32L233C-START开发板。 连接引脚:SPI_CS—PB12、SPI_CLK—PB13、SPI_MOSI—PB15、SPI_MISO—PB14、RS—PB8、RST—PB7、LED—PB9。 模式说明:因为屏幕仅需接收MCU给其的显示数据,无需返回数据给MCU,所以我们仅需实现SPI为**发送**即可。 # 3、SPI的四种模式及初始化 | SPI模式 | CKPH | CKPL | 空闲时SCK电平 | 采样时刻 | | ------- | ---- | ---- | ------------- | -------- | | 0       | 0    | 0    | 低电平        | 第一边沿 | | 1       | 0    | 1    | 高电平        | 第一边沿 | | 2       | 1    | 0    | 低电平        | 第二边沿 | | 3       | 1    | 1    | 高电平        | 第二边沿 | > *图片截取自《GD32L23x_yonghushouce_Rev1.0.pdf》——P476.* 此处选择SPI1。 SPI1初始化代码如下: ```c void SPI1_Init(void)        {     spi_parameter_struct spi_init_struct;     rcu_periph_clock_enable(RCU_GPIOB);     rcu_periph_clock_enable(RCU_SPI1);     /* SPI1_CLK(PB13), SPI1_MIS1_IO1(PB14), SPI1_MOSI_IO0(PB15) GPIO pin configuration */     gpio_af_set(GPIOB, GPIO_AF_6,  GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);     gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);     gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);     /* SPI1_CS (PB12) GPIO pin configuration */     gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,  GPIO_PIN_12);     gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12);     gpio_bit_set(GPIOB, GPIO_PIN_2);     /* chip select invalid */     LCD_CS_SET;     /* SPI1 parameter config */     spi_init_struct.trans_mode           = SPI_TRANSMODE_FULLDUPLEX;     spi_init_struct.device_mode          = SPI_MASTER;     spi_init_struct.frame_size           = SPI_FRAMESIZE_8BIT;     spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;     spi_init_struct.nss                  = SPI_NSS_SOFT;     spi_init_struct.prescale             = SPI_PSC_2;     spi_init_struct.endian               = SPI_ENDIAN_MSB;     spi_init(SPI1, &spi_init_struct);     /* configure SPI1 byte access to FIFO */     spi_fifo_access_size_config(SPI1, SPI_BYTE_ACCESS);     /* set crc polynomial */     spi_crc_polynomial_set(SPI1, 7);     /* enable SPI1 */     spi_enable(SPI1); } ``` # 4、SPI写字节实现 实现代码如下: ```c uint8_t SPI_WriteByte(uint8_t Byte) {            while(RESET == spi_i2s_flag_get(SPI1, SPI_FLAG_TBE));            spi_i2s_data_transmit(SPI1, Byte);     while(spi_i2s_flag_get(SPI1, SPI_FLAG_RBNE)==RESET);//等待接收完一个byte        return 0; } ``` # 5、其它 在一个可以调用的`.h`文件中添加如下代码: ```c //GPIO置位(拉高) #define LCD_CS_SET  gpio_bit_set(GPIOB, GPIO_PIN_12)    //片选端口   PB12 #define LCD_RS_SET  gpio_bit_set(GPIOB, GPIO_PIN_8)     //数据/命令  PB8   #define LCD_RST_SET gpio_bit_set(GPIOB, GPIO_PIN_7)     //复位      PB7 //GPIO复位(拉低)                                                             #define LCD_CS_CLR  gpio_bit_reset(GPIOB, GPIO_PIN_12)  //片选端口   PB12 #define LCD_RS_CLR  gpio_bit_reset(GPIOB, GPIO_PIN_8)   //数据/命令  PB8 #define LCD_RST_CLR gpio_bit_reset(GPIOB, GPIO_PIN_7)   //复位       PB7 ``` 此些引脚为屏幕显示的必备引脚,需对其配合驱动流程进行控制。 其它的部分,基于官方例程实现即可。 # 6、效果 # 后记 - 前文之所以不准备发,是因为驱动TFT屏正常显示后,才想起来与实际要做的综合项目不符,综合项目里用不到TFT屏,因为功耗较高。不过既然做完了,就还是发出来吧,万一正好有人需要验证呢,为可能有需要的人贡献一点绵薄之力吧。 - 基于TFT屏的功耗问题,后续会使用墨水屏,也使用SPI驱动。已经做了屏幕转接板在打样了,后续驱动成功后再发一篇记录。 - 转接板预览图如下:    # 结语 - 外设SPI测试写到这里,对SPI没有测试完全,仅仅测试了写还没有读。后续有需要的话会加上。 - 以上内容若有错误,请不吝赐教。我这厢有礼了:Onion-93:~ - 下节继续测试MCU外设。 > 另:附件上传工程源码。附件说明如下: > > **13-GD32L233CCT6-Test.zip**:硬件SPI外设驱动TFT屏。

最近访客

< 1/2 >

统计信息

已有20人来访过

  • 芯积分:559
  • 好友:--
  • 主题:10
  • 回复:34
  • 课时:--
  • 资源:4

留言

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


现在还没有留言