mameng

  • 2022-05-09
  • 回复了主题帖: 【phyBOARD-i.MX 8M Plus 开发板】测评之一:硬件分析

    吐槽一下:一开视频,芯片烫手~~

  • 发表了主题帖: 【phyBOARD-i.MX 8M Plus 开发板】测评之一:硬件分析

          这个板子是老外德国PHYTEC开发的,板子资料都是英文,没点英文基础一头雾水啊。开发板介绍:  基于NXP i.MX 8M Plus SoC phyCORE-i.MX 8M。配备多达4-Cortex-A53,用于实时应用的Cortex-M7,以及一个独特的组合,多种多样的多媒体接口,功能强大NPU(神经处理单元)适用于i.MX 8M,此外,SoC在机器学习(ML)方面表现优异,图像处理、高级多媒体和工业物联网应用。可扩展且尺寸优化的phyCOREi。MX 8M Plus是使用所有i、 MX 8M Plus在以下领域发挥作用:多媒体的智能快速处理在最小的空间中需要数据。在里面吗智能家居、智能城市、工业4.0或IIoT应用。    开发板照片:   架构图: 资源: SPI NOR Flash 64 MB eMMC 8 GB eMMC 5.1 LPDDR4 RAM 2 GB EEPROM 4 kB   Ethernet 2x 10/100/1000BASE-T (1x TSN support) Wireless via optional Wi-Fi Adapter USB 2x 3.0 Host Serial 1x RS-232/RS-485 Full Duplex/RS-485 Half Duplex CAN 2x CAN FD Digital I/O optional via Expansion Connector PCle 1x miniPCIe MMC/SD/SDIO microSD Card Slot Display LVDS (1x 4 lanes or 1x 8 lanes), MIPI DSI (1x 4 lanes), HDMI Audio SAI via A/V Connector Camera 2x MIPI CSI-2 (phyCAM-M) Expansion Bus I²C, SPI, SDIO (8-bit), UART, JTAG, USB JTAG via Expansion Connector User Control Elements 1x Reset Button, 1x On/Off, 1x Boot source select Boot Source eMMC, SD Card, NOR, USB Serial Download, Internal Fuses     RTC Real Time Clock (mounted on SoM) with Gold Cap Backup Power supply 12 V - 24 V Dimensions 160 mm x 77 mm Temperature range -20 °C to +85 °C   适配的开关电源: 所有的资料在官方: https://www.phytec.de/produkte/development-kits/   操作视频如下;  

  • 2022-04-14
  • 加入了学习《2022 Digi-Key 物联网创新大赛》,观看 Digi-Key 物联网创新大赛

  • 2022-02-23
  • 发表了主题帖: 【GD32L233C-START评测】测评之五:多通道PWM测试

    一、PWM介绍 1.PWM定义:脉冲宽度调制(PWM) 是一种数字信号,最常用于控制电路。该信号在预定义的时间和速度中设置为高(5v或3.3v)和低(0v)。通常,我们将PWM的高电平称为1,低电平为0。 PWM在嵌入式系统中扮演者非常重要的角色,它可以控制显示屏和led的亮度、可以控制电机的转速和舵机的角度,通过pwm将数字的电压输出信号转化成了模拟电压的输出, 2.主要参数 (1)PWM占空比 PWM信号保持高电平的时间百分比称为占空比。如果信号始终为高电平,则它处于100%占空比,如果它始终处于低电平,则占空比为0%。如图1所示,T1为占空比,T为一个PWM周期。 (2)PWM的频率  PWM信号的频率决定PWM完成一个周期的速度。   3.GD32L233xx pin alternate functions:: 4.占空比,频率计算方式:、 5.程序设计:开启两路Pa6 ,PA7通道:根据4算,频率为10K ,占空比:PA6 20% PA7:60% void gpio_config(void) { rcu_periph_clock_enable(RCU_GPIOA); /* TIMER1 GPIO */ gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7|GPIO_PIN_6 ); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7|GPIO_PIN_6); gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_7|GPIO_PIN_6); } void timer_config(void) { timer_oc_parameter_struct timer_ocinitpara; timer_parameter_struct timer_initpara; /* enable the peripherals clock */ rcu_periph_clock_enable(RCU_TIMER2); /* deinit a TIMER */ timer_deinit(TIMER2); /* initialize TIMER init parameter struct */ timer_struct_para_init(&timer_initpara); /* TIMER2 configuration */ timer_initpara.prescaler = 63; timer_initpara.alignedmode = TIMER_COUNTER_EDGE; timer_initpara.counterdirection = TIMER_COUNTER_UP; timer_initpara.period = 99; timer_initpara.clockdivision = TIMER_CKDIV_DIV1; timer_init(TIMER2, &timer_initpara); /* initialize TIMER channel output parameter struct */ timer_channel_output_struct_para_init(&timer_ocinitpara); /* configure TIMER channel output function */ timer_ocinitpara.outputstate = TIMER_CCX_ENABLE; timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH; timer_channel_output_config(TIMER2, TIMER_CH_1, &timer_ocinitpara); timer_channel_output_mode_config(TIMER2, TIMER_CH_1, TIMER_OC_MODE_PWM0); timer_enable(TIMER2); timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_1, 60); timer_channel_output_config(TIMER2, TIMER_CH_0, &timer_ocinitpara); timer_channel_output_mode_config(TIMER2, TIMER_CH_0, TIMER_OC_MODE_PWM0); timer_enable(TIMER2); timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_0, 20); } 6  测试结果: 7,结论:   实验值与理论值温和,GD32L232PWM功能强大!

  • 回复了主题帖: 【GD32L233C-START评测】3、pwm实现呼吸灯

    工程文件共享性下?

  • 2022-01-22
  • 回复了主题帖: GD32L233C-START评测——03_1.CoreMark测试、RT-Thread-Nano移植

    工程文件分享一下可以啊

  • 回复了主题帖: 【GD32L233C-START评测】3、pwm实现呼吸灯

    SystemGetTick()在哪里

  • 发表了主题帖: 【GD32L233C-START评测】测评之四:使用定时器time中断实现1S跑马灯

      定时器初始化  : timer_initpara.prescaler      typedef struct {     uint16_t prescaler;                                      /*!< prescaler value */     uint16_t alignedmode;                                    /*!< aligned mode */     uint16_t counterdirection;                               /*!< counter direction */     uint32_t period;                                         /*!< period value */     uint16_t clockdivision;                                  /*!< clock division value */ } timer_parameter_struct;       取值范围:UInt16 - [0 : 65535] 完整程序 #include "gd32l23x.h" #include "systick.h" static uint32_t SystemTick=0; void TIMER5_Config(void) { timer_parameter_struct timer_initpara; //计时器初始化参数结构定义 rcu_periph_clock_enable(RCU_TIMER5); timer_deinit(TIMER5); /*prescaler(预分频器值):64M/(6399+1)=10KHz period(周期值) (9999+1)/10000=1000ms */ timer_initpara.prescaler = 6399; timer_initpara.alignedmode = TIMER_COUNTER_EDGE; timer_initpara.counterdirection = TIMER_COUNTER_UP; timer_initpara.period = 9999; timer_initpara.clockdivision = TIMER_CKDIV_DIV1; timer_init(TIMER5,&timer_initpara); timer_interrupt_enable(TIMER5, TIMER_INT_UP);//使能TIMER5中断 nvic_irq_enable(TIMER5_IRQn, 0);//启用TIMER5的NVIC请求,优先级为0(0~3) timer_auto_reload_shadow_enable(TIMER5); timer_enable(TIMER5); } void TIMER5_IRQHandler(void) { static uint16_t timer_cont=0; if(RESET != timer_interrupt_flag_get(TIMER5, TIMER_INT_FLAG_UP)) { timer_cont++; // if(timer_cont>5) { // timer_cont=0; gpio_bit_toggle(GPIOA, GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8); gpio_bit_toggle(GPIOC, GPIO_PIN_6 | GPIO_PIN_7); } } timer_interrupt_flag_clear(TIMER5, TIMER_INT_FLAG_UP); } uint32_t SystemGetTick(void) { return SystemTick; } void LedInit(void) { /* enable the LED GPIO clock */ rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_GPIOC); /* configure LED GPIO pin */ gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6| GPIO_PIN_7 | GPIO_PIN_8); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7| GPIO_PIN_8); gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6 | GPIO_PIN_7); gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7); /* reset LED GPIO pin */ gpio_bit_reset(GPIOA, GPIO_PIN_6 | GPIO_PIN_8| GPIO_PIN_7); gpio_bit_reset(GPIOC, GPIO_PIN_6 | GPIO_PIN_7); } int main(void) { TIMER5_Config(); LedInit(); while(1) { } } 现象:      

  • 发表了主题帖: 【GD32L233C-START评测】测评之三:使用定时器time5精确延时测量

    本帖最后由 mameng 于 2022-1-22 20:45 编辑 (一)​GD32L233C-START例子程序用的是SysTick延时:     改造main函数:      while(1) { gpio_bit_set(GPIOA, GPIO_PIN_7); gpio_bit_set(GPIOA, GPIO_PIN_1); delay_1ms(1); gpio_bit_reset(GPIOA, GPIO_PIN_7); gpio_bit_reset(GPIOA, GPIO_PIN_1); delay_1ms(1);     }     测量PA1示波波形:      可以看出正脉冲宽度可以看出SysTick延时1.0Ms,非常精确,脉冲上升沿时间20.us,表示电平变化时间,这与示波器带宽和采样精度有关,不是GPIO电平变化 指令周期需要的时间。   (二)采用定时器延时:注意GD32L233C主频64M    计算方式: prescaler(预分频器值):64M/(63+1)=1000KHz                 period(周期值) (999+1)/1000000=1ms   测定不同配置下定时器延时精度:   void TIMER5_Config(void) {         timer_parameter_struct timer_initpara;      //计时器初始化参数结构定义         rcu_periph_clock_enable(RCU_TIMER5);         timer_deinit(TIMER5);         /*prescaler(预分频器值):64M/(63+1)=1000KHz                 period(周期值) (999+1)/1000000=1ms         */ timer_initpara.prescaler        = 63; timer_initpara.alignedmode       = TIMER_COUNTER_EDGE; timer_initpara.counterdirection  = TIMER_COUNTER_UP; timer_initpara.period            = 999; timer_initpara.clockdivision     = TIMER_CKDIV_DIV1; timer_init(TIMER5,&timer_initpara);         timer_interrupt_enable(TIMER5, TIMER_INT_UP);//使能TIMER5中断         nvic_irq_enable(TIMER5_IRQn, 0);//启用TIMER5的NVIC请求,优先级为0(0~3)                  timer_auto_reload_shadow_enable(TIMER5);         timer_enable(TIMER5);                   } void TIMER5_IRQHandler(void) {         static uint8_t timer_cont=0;         if(RESET != timer_interrupt_flag_get(TIMER5, TIMER_INT_FLAG_UP))         { gpio_bit_toggle(GPIOA, GPIO_PIN_6 | GPIO_PIN_8);        }         timer_interrupt_flag_clear(TIMER5, TIMER_INT_FLAG_UP); } 测量PA6波形        timer_initpara.period  999,改为99,定时器产生100uS延时。       timer_initpara.period  999,改为9,定时器产生10uS延时。     可见定时器延时非常精准    

  • 2022-01-17
  • 发表了主题帖: 【GD32L233C-START评测】测评之二:库函数解析,GPIO点灯

    GD32L23X库函数:片上资源丰富,全部给出API接口,相对于寄存器编程,大大降低开发难度。     先给个点灯测试: 原理图:LED属于关电流驱动,可以测评GPIO驱动能力。根于属于手册,GPIO可以拉灌25ma电流。 GPIO初始化: systick_config(); /* enable the LED GPIO clock */ rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_GPIOC); gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7 | GPIO_PIN_8); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7 | GPIO_PIN_8); gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6 | GPIO_PIN_7); gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7); /* reset LED GPIO pin */ gpio_bit_reset(GPIOA, GPIO_PIN_7 | GPIO_PIN_8); gpio_bit_reset(GPIOC, GPIO_PIN_6 | GPIO_PIN_7); 关键配置: gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7 | GPIO_PIN_8);     延时有:SysTick 产生 1ms,解析:      Sys-系统,Tick-滴答声,系统滴答滴答很形象地表示了它是一个系统节拍器。SysTick 是一个集成在Cortex内核里的24位的倒计数定时器,当计到0时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。 SysTick的作用。 SysTick主要有以下几个作用: 1、产生操作系统的时钟节拍; 当RTOS以并行的架构处理任务,单一任务的崩溃并不会牵连到整个系统。这样用户出于可靠性的考虑可能就会基于RTOS来设计自己的应用程序。这样SYSTICK存在的意义就是提供必要的时钟节拍,为RTOS的任务调度提供一个有节奏的“心跳”。 2、便于不同处理器之间程序移植 因为所有的CM3芯片都带有这个定时器,软件在不同 CM3器件间的移植工作得以化简。 3、作为一个闹铃测量时间 可以用作闹钟,作为启动一个特定任务的时间依据。它作为一个闹铃,用于测量时间。要注意的是,当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作。 #include "gd32l23x.h" #include "systick.h" volatile static uint32_t delay; /*! \brief configure systick \param[in] none \param[out] none \retval none */ void systick_config(void) { /* setup systick timer for 1000Hz interrupts */ if(SysTick_Config(SystemCoreClock / 1000U)) { /* capture error */ while(1) { } } /* configure the systick handler priority */ NVIC_SetPriority(SysTick_IRQn, 0x00U); } /*! \brief delay a time in milliseconds \param[in] count: count in milliseconds \param[out] none \retval none */ void delay_1ms(uint32_t count) { delay = count; while(0U != delay) { } } /*! \brief delay decrement \param[in] none \param[out] none \retval none */ void delay_decrement(void) { if(0U != delay) { delay--; } }  流水灯改进 /* turn on LED1, turn off LED4 */ gpio_bit_set(GPIOA, GPIO_PIN_7); gpio_bit_reset(GPIOC, GPIO_PIN_7); /* turn on LED2, turn off LED1 */ gpio_bit_set(GPIOA, GPIO_PIN_8); gpio_bit_reset(GPIOA, GPIO_PIN_7); delay_1ms(500); /* turn on LED3, turn off LED2 */ gpio_bit_set(GPIOC, GPIO_PIN_6); gpio_bit_reset(GPIOA, GPIO_PIN_8); delay_1ms(500); /* turn on LED4, turn off LED3 */ gpio_bit_set(GPIOC, GPIO_PIN_7); gpio_bit_reset(GPIOC, GPIO_PIN_6); delay_1ms(500); gpio_bit_reset(GPIOC, GPIO_PIN_7); delay_1ms(500); gpio_bit_set(GPIOA, GPIO_PIN_7); gpio_bit_set(GPIOA, GPIO_PIN_8); gpio_bit_set(GPIOC, GPIO_PIN_6); gpio_bit_set(GPIOC, GPIO_PIN_7); delay_1ms(500); gpio_bit_reset(GPIOC, GPIO_PIN_7); gpio_bit_reset(GPIOA, GPIO_PIN_7); gpio_bit_reset(GPIOA, GPIO_PIN_8); gpio_bit_reset(GPIOC, GPIO_PIN_6); delay_1ms(500); gpio_bit_set(GPIOA, GPIO_PIN_7); gpio_bit_set(GPIOA, GPIO_PIN_8); gpio_bit_set(GPIOC, GPIO_PIN_6); gpio_bit_set(GPIOC, GPIO_PIN_7); delay_1ms(500); gpio_bit_reset(GPIOC, GPIO_PIN_7); gpio_bit_reset(GPIOA, GPIO_PIN_7); gpio_bit_reset(GPIOA, GPIO_PIN_8); gpio_bit_reset(GPIOC, GPIO_PIN_6); delay_1ms(500); gpio_bit_set(GPIOA, GPIO_PIN_7); gpio_bit_set(GPIOA, GPIO_PIN_8); gpio_bit_set(GPIOC, GPIO_PIN_6); gpio_bit_set(GPIOC, GPIO_PIN_7); delay_1ms(500); gpio_bit_reset(GPIOC, GPIO_PIN_7); gpio_bit_reset(GPIOA, GPIO_PIN_7); gpio_bit_reset(GPIOA, GPIO_PIN_8); gpio_bit_reset(GPIOC, GPIO_PIN_6); delay_1ms(500);delay_1ms(500);delay_1ms(500); 上视频:    

  • 发表了日志: 【GD32L233C-START评测】测评之一:开箱测评,芯片架构级测评

  • 发表了主题帖: 【GD32L233C-START评测】测评之一:开箱测评,芯片架构级测评

         GD32L233系列的低功耗微控制器是兆易创新基于ArmV8-M架构的 Cortex®-M23内核MCU,采用了领先的40nm超低功耗(ULP)制造技术,低漏电物理单元从硬件层面降低功耗。最高主频为64MHz,集成了64KB到256KB的嵌入式eFlash和16KB到32KB的SRAM,以及连接到两条APB总线的各类增强型I/O和外设资源。通过精简强大的Armv8-M指令集和全面优化的总线设计带来高效处理能力,包含独立的乘法器和除法器,根据不同的目的和目标存储空间,都会在AHB总线上执行。存储器的组织采用了ARMv8M结构,预先定义的存储器映射和高达4GB的存储空间,充分保证了系统的灵活性和可扩展性。适用于低功耗、高效节能的深度嵌入式应用场景。    开发板照片:      GD-link下载器,用的GD32F103C8T ,主控芯片:开发板简约,麻雀虽小五脏俱全。   Arm® Cortex®-M23处理器是一个低功耗32位处理器。 适用于需要一个区域优化处理器来进行深度嵌入式应用的场景。 Arm® Cortex®-M23处理器为开发人员提供了显著的好处,包括: 1,一个简单的体系结构,易于学习和编程; 2, 超低功耗、 高效节能; 3, 优秀的代码密度; 4, 确定性、 高性能中断处理; 5, 向上兼容Cortex-M处理器家族系列。 Arm® Cortex®-M23处理器通过精简强大的指令集和广泛优化的设计提供高效处理能力,提供,包括单周期乘法器和17周期分频器的高端处理硬件。Arm® Cortex®-M23处理器高度集成了一个可配置的嵌套矢量中断控制器(NVIC),以提供业界领先的中断性能   GD32L23x 系列器件的系统架构示意图:       为了提升平台安全性,ARM推出了ARMv8m架构,该架构引入了Trustzone安全扩展,该技术主要利用隔离技术将地址空间划分安全和非安全区域,实现了空间隔离,这里我们称之为安全世界和非安全世界,两个世界的切换/交互通过指令集增加的几条指令实现(SG/BXNX/BLXNX)。ARMv8M架构:主打安全和低功耗,IOT时代安全第一,            GD32L233系列MCU实现了优异的功耗效率,深度睡眠(Deep-sleep)电流降至2uA,唤醒时间低于10uS,待机(Standby)电流最低仅有0.4uA。深度睡眠模式下能够被多种系统时钟、外设接口触发,支持Low power Timer、Low power UART、RTC、LCD以及标准I2C、USART等在内的多个唤醒源。GD32L233系列片上资源丰富,MCU提供了多至4个通用16位定时器、2个基本定时器和1个32位低功耗定时器,以及标准和高级通信接口:多至2个USART、2个UART、1个低功耗LPUART、3个I2C、2个SPI、1个I2S和1个USB 2.0 FS控制器。其中32位Low power Timer、Low power UART都能够在Deep-sleep1/2模式下运行并唤醒MCU。模拟外设方面,还集成了1个12位采样率1M SPS的ADC、1个12位DAC和2个比较器。                           

  • 2022-01-16
  • 发表了主题帖: 【二哈识图人工智能视觉传感器】测评之六: 与ARM单片机TFT展示人脸识别结果

        二哈试图的串口通信协议; 人脸识别之串口测试 。识别成功收到数据 55 AA 11 0A 29 01 00 01 00 9B 03 00 00 00 00 E3 55 AA 11 0A 2A D9 00 71 00 30 00 40 00 01 00 FF 55 AA 11 0A 29 01 00 01 00 B5 03 00 00 00 00 FD 55 AA 11 0A 2A D9 00 64 00 30 00 40 00 01 00 F2 55 AA 11 0A 29 01 00 01 00 C5 03 00 00 00 00 0D 55 AA 11 0A 2A D8 00 63 00 30 00 40 00 01 00 F0 未识别记忆人脸收到数据 55 AA 11 0A 29 00 00 01 00 29 0E 00 00 00 00 7B 55 AA 11 0A 29 00 00 01 00 38 0E 00 00 00 00 8A 55 AA 11 0A 29 00 00 01 00 44 0E 00 00 00 00 96 55 AA 11 0A 29 00 00 01 00 4F 0E 00 00 00 00 A1 可以判断55 AA 11 0A 29后面不为零即代表检测出记忆人脸、   上次申请的到复旦微32位单片机开发板,驱动中景园TFT,与二哈试图串口通讯,关于屏的驱动,可以看我之前测评。 串口初始化;.用串口中断状态机判定,判断55 AA 11 0A 29后面不为零即代表检测出记忆人脸 void DebugUartInit(void) { FL_GPIO_InitTypeDef GPIO_InitStruct = {0}; FL_UART_InitTypeDef UART_InitStruct = {0}; //PA13:UART0-RX PA14:UART0-TX GPIO_InitStruct.pin = FL_GPIO_PIN_13|FL_GPIO_PIN_14; GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL; GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.pull = FL_ENABLE; GPIO_InitStruct.remapPin = FL_DISABLE; FL_GPIO_Init(GPIOA, &GPIO_InitStruct); UART_InitStruct.clockSrc = FL_CMU_UART0_CLK_SOURCE_APBCLK; UART_InitStruct.baudRate = 9600; //波特率 UART_InitStruct.dataWidth = FL_UART_DATA_WIDTH_8B; //数据位数 UART_InitStruct.stopBits = FL_UART_STOP_BIT_WIDTH_1B; //停止位 UART_InitStruct.parity = FL_UART_PARITY_EVEN; //奇偶校验 UART_InitStruct.transferDirection = FL_UART_DIRECTION_TX_RX; //接收-发送使能 FL_UART_Init(UART0, &UART_InitStruct); } 测试视频:  

  • 发表了主题帖: 【二哈识图人工智能视觉传感器】测评之五:  二哈识图之物体识别

        物体识别,目标检测(Object Detection)的任务是找出图像中特定的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。 计算机视觉中关于图像识别有四大类任务: (1)分类-Classification:解决“是什么?”的问题,即给定一张图片或一段视频判断里面包含什么类别的目标。 (2)定位-Location:解决“在哪里?”的问题,即定位出这个目标的的位置。 (3)检测-Detection:解决“在哪里?是什么?”的问题,即定位出这个目标的位置并且知道目标物是什么。 (4)分割-Segmentation:分为实例的分割(Instance-level)和场景分割(Scene-level),解决“每一个像素属于哪个目标物或场景”的问题。   目标检测目前的框架RCNN系列、SSD、YOLO系列很多新的方法也是在此基础上做一些改进。      二哈识图之物体识别已经训练好特定的物体识别模型。 二哈识别狗狗当然人事同类了OK 识别摩托车OK 识别自行车OK    识别牛OK 识别羊NG 这是一只羊,羊可能没有训练吧,识别成牛了。哈哈  识别马 OK 识别飞机OK 识别人,OK   识别猫OK  狮子没训练 ,识别成猫科都是猫 猴子当成狗了 二哈也是挺聪明的,这不是杯子,这是屏幕,对,这是屏幕,没毛病。哈哈哈   大千世界,物类超多,即使人也没能力识别万物,二哈识图能识别这些东西,比哈士奇厉害百倍了。

  • 2022-01-08
  • 发表了主题帖: 【二哈识图人工智能视觉传感器】测评之四人脸算法

             二哈HuskyLens识图目前硬件原理图和源代码不开源, 这个套件面向青少年创客。主控为勘智K210是嘉楠科技自主研发的一款边缘侧AI芯片,基于RISC-V架构,内置卷积神经网络加速器KPU。KPU可以实现人脸检测、人脸识别、图像识别、图像分类等机器视觉任务K210 的 KPU。简单来说就是 KPU 能加载和运行各种现成的 AI 算法模型,实现各种机器视 觉等功能。主要通过在 K210 的 KPU 上跑 YOLO(You Only Look Once)目标检测算法来实现。人脸识别采用基于YOLO的人脸检测算法和特征提取算法。  K210的KPU算力有0.8TOPS 。小小的芯片这个算力很厉害了。主要参数:   人脸识别、特征学习 KPU 在 MaixPy 关键代码,二哈HuskyLens识图是不涉及复杂的AI算法,AI算法已经封装好了,创客拿来用就可以了。 def face_recognize(): global flag_enter global task_mask,task_ld,task_fe global sum_3 global sum_4 global now_mode img = sensor.snapshot() code = kpu.run_yolo2(task_fd, img) if code: for i in code: # Cut face and resize to 128x128 a = img.draw_rectangle(i.rect()) face_cut = img.cut(i.x(), i.y(), i.w(), i.h()) face_cut_128 = face_cut.resize(128, 128) a = face_cut_128.pix_to_ai() # a = img.draw_image(face_cut_128, (0,0)) # Landmark for face 5 points fmap = kpu.forward(task_ld, face_cut_128) plist = fmap[:] le = (i.x() + int(plist[0] * i.w() - 10), i.y() + int(plist[1] * i.h())) re = (i.x() + int(plist[2] * i.w()), i.y() + int(plist[3] * i.h())) nose = (i.x() + int(plist[4] * i.w()), i.y() + int(plist[5] * i.h())) lm = (i.x() + int(plist[6] * i.w()), i.y() + int(plist[7] * i.h())) rm = (i.x() + int(plist[8] * i.w()), i.y() + int(plist[9] * i.h())) a = img.draw_circle(le[0], le[1], 4) a = img.draw_circle(re[0], re[1], 4) a = img.draw_circle(nose[0], nose[1], 4) a = img.draw_circle(lm[0], lm[1], 4) a = img.draw_circle(rm[0], rm[1], 4) # align face to standard position src_point = [le, re, nose, lm, rm] T = image.get_affine_transform(src_point, dst_point) a = image.warp_affine_ai(img, img_face, T) a = img_face.ai_to_pix() # a = img.draw_image(img_face, (128,0)) del (face_cut_128) # calculate face feature vector fmap = kpu.forward(task_fe, img_face) feature = kpu.face_encode(fmap[:]) reg_flag = False scores = [] for j in range(len(record_ftrs)): score = kpu.face_compare(record_ftrs[j], feature) scores.append(score) max_score = 0 index = 0 for k in range(len(scores)): if max_score < scores[k]: max_score = scores[k] index = k if max_score > 85: a = img.draw_string(i.x(), i.y(), ("%s :%2.1f" % ( names[index], max_score)), color=(0, 255, 0), scale=2) sum_3+=1 if sum_3 == 10: uart_A.write(b'i') print(sum_3) sum_3=0 sum_4=0 now_mode = 0 else: a = img.draw_string(i.x(), i.y(), ("X :%2.1f" % ( max_score)), color=(255, 0, 0), scale=2)#串口数据预留 sum_4+=1 if sum_4 == 10: uart_A.write(b'j') print(sum_4) sum_3=0 sum_4=0 now_mode = 0 #特征值学习 if flag_enter==1 : print('feature study') #features_data = uart_A.read() #if features_data: #stu_name = features_data.decode('utf-8') #print("stu_name=",stu_name) with open("/sd/features.txt", "a") as f: f.write(str(feature)) #信息写入SD卡 record_ftrs.append(feature) #人脸特征追加到record_ftrs列表 #names.append(stu_name) #追加到姓名列表 f.write("\n") f.close() flag_enter=0 uart_A.write(b'i') now_mode = 0 sum_3=0 sum_4=0 #写入sd卡 break        下面进行二哈HuskyLens识图测试:      放一张女神刘亦菲:     将HuskyLenser二哈屏幕中央的“+”字对准需要学习的人脸,长按“学习按键”完成第一个人脸的学习(各个角度)。松开”学习按键“后,屏幕上会提示:”再按一次按键继续!按其他按键结束“。如要继续学习下一个人脸,则在倒计时结束前短按“学习按键”,可以继续学习下一个人脸。如果不再需要学习其他人脸了,则在倒计时结束前短按”功能按键”即可,或者不操作任何按键,等待倒计时结束。套件可以进行360不同角度深度学习记忆,大大提高准确度。 识别OK,测试: 来一张古装测试看看:识别! 看看二哈能不能从多人中认识神仙姐姐:OK,识别准确度很高的,可以用来做门禁识别     

  • 回复了主题帖: 【二哈识图人工智能视觉传感器】3、与处理器进行串口通信

    你这是测试了个寂寞啊 

  • 发表了主题帖: 【二哈识图人工智能视觉传感器】测评之三:通过HUSKYLENS Uploader固件升级

         HuskyLens人工智能摄像头采用了新一代的AI芯片Kendryte K210,内置64位400MHz双核RISC-V 处理器,运行神经网络算法的速度比STM32H743快1000倍以上。经典的YOLO人工智能算法在STM32H743上只能以每秒1~2帧的速度运行,但在HuskyLens上则可以快30倍以上。 内置的固件版本: 下载升级工具和固件:https://wiki.dfrobot.com.cn/_SKU_SEN0305_Gravity__HUSKYLENS_%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E6%91%84%E5%83%8F%E5%A4%B4 工具地址 升级之后的固件版本          

  • 2022-01-05
  • 回复了主题帖: 【获奖名单】解锁 TI Sitara ™ AM2x MCU 在电机驱动中的新可能

    获奖了  但是公众号识别不出来啊 

  • 2021-12-21
  • 发表了日志: [复旦微FM33LG0系列开发板测评] 驱动RGB TFT显示屏

  • 发表了主题帖: [复旦微FM33LG0系列开发板测评] 驱动RGB TFT显示屏

         今天冬至,看到朋友圈都在吃饺子。想写个祝福大家冬至的话题。手里有个中景园电子技术有限公司320RGB*480 dots matrix TFT LCD 模块,想用FM33LG0驱动一下:        PIN定义: 逻辑时序图:   普通口模拟: void LCD_GPIO_Init(void) { FL_GPIO_InitTypeDef GPIO_InitStruct = {0}; FL_GPIO_ResetOutputPin(GPIOA, FL_GPIO_PIN_0|FL_GPIO_PIN_1|FL_GPIO_PIN_2|FL_GPIO_PIN_3|FL_GPIO_PIN_4|FL_GPIO_PIN_5|FL_GPIO_PIN_6|FL_GPIO_PIN_7); GPIO_InitStruct.pin = FL_GPIO_PIN_0|FL_GPIO_PIN_1|FL_GPIO_PIN_2|FL_GPIO_PIN_3|FL_GPIO_PIN_4|FL_GPIO_PIN_6|FL_GPIO_PIN_7; GPIO_InitStruct.mode = FL_GPIO_MODE_OUTPUT; GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.pull = FL_DISABLE; FL_GPIO_Init(GPIOA, &GPIO_InitStruct); FL_GPIO_ResetOutputPin(GPIOB, FL_GPIO_PIN_5); GPIO_InitStruct.pin = FL_GPIO_PIN_5; GPIO_InitStruct.mode = FL_GPIO_MODE_INPUT ; GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.pull = FL_DISABLE; FL_GPIO_Init(GPIOB, &GPIO_InitStruct); // GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_6|GPIO_Pin_7); } #define LCD_SCLK_Clr() FL_GPIO_ResetOutputPin(GPIOA,FL_GPIO_PIN_0)//SCL=SCLK #define LCD_SCLK_Set() FL_GPIO_SetOutputPin(GPIOA,FL_GPIO_PIN_0) #define LCD_MOSI_Clr() FL_GPIO_ResetOutputPin(GPIOA,FL_GPIO_PIN_1)//SDA=MOSI #define LCD_MOSI_Set() FL_GPIO_SetOutputPin(GPIOA,FL_GPIO_PIN_1) #define LCD_RES_Clr() FL_GPIO_ResetOutputPin(GPIOA,FL_GPIO_PIN_2)//RES #define LCD_RES_Set() FL_GPIO_SetOutputPin(GPIOA,FL_GPIO_PIN_2) #define LCD_DC_Clr() FL_GPIO_ResetOutputPin(GPIOA,FL_GPIO_PIN_3)//DC #define LCD_DC_Set() FL_GPIO_SetOutputPin(GPIOA,FL_GPIO_PIN_3) #define LCD_BLK_Clr() FL_GPIO_ResetOutputPin(GPIOA,FL_GPIO_PIN_4)//BLK #define LCD_BLK_Set() FL_GPIO_SetOutputPin(GPIOA,FL_GPIO_PIN_4) #define ZK_MISO FL_GPIO_ReadInputPort(GPIOB)//MISO 读取字库数据引脚 // GPIO_ReadInputDataBit //GPIO_ResetBits #define LCD_CS_Clr() FL_GPIO_ResetOutputPin(GPIOA,FL_GPIO_PIN_6)//CS #define LCD_CS_Set() FL_GPIO_SetOutputPin(GPIOA,FL_GPIO_PIN_6) #define ZK_CS_Clr() FL_GPIO_ResetOutputPin(GPIOA,FL_GPIO_PIN_7) #define ZK_CS_Set() FL_GPIO_SetOutputPin(GPIOA,FL_GPIO_PIN_7) 驱动代码: #include "lcd_init.h" void LCD_GPIO_Init(void) { FL_GPIO_InitTypeDef GPIO_InitStruct = {0}; FL_GPIO_ResetOutputPin(GPIOA, FL_GPIO_PIN_0|FL_GPIO_PIN_1|FL_GPIO_PIN_2|FL_GPIO_PIN_3|FL_GPIO_PIN_4|FL_GPIO_PIN_5|FL_GPIO_PIN_6|FL_GPIO_PIN_7); GPIO_InitStruct.pin = FL_GPIO_PIN_0|FL_GPIO_PIN_1|FL_GPIO_PIN_2|FL_GPIO_PIN_3|FL_GPIO_PIN_4|FL_GPIO_PIN_6|FL_GPIO_PIN_7; GPIO_InitStruct.mode = FL_GPIO_MODE_OUTPUT; GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.pull = FL_DISABLE; FL_GPIO_Init(GPIOA, &GPIO_InitStruct); FL_GPIO_ResetOutputPin(GPIOB, FL_GPIO_PIN_5); GPIO_InitStruct.pin = FL_GPIO_PIN_5; GPIO_InitStruct.mode = FL_GPIO_MODE_INPUT ; GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.pull = FL_DISABLE; FL_GPIO_Init(GPIOB, &GPIO_InitStruct); // GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_6|GPIO_Pin_7); } /****************************************************************************** 函数说明:LCD串行数据写入函数 入口数据:dat 要写入的串行数据 返回值: 无 ******************************************************************************/ void LCD_Writ_Bus(u8 dat) { u8 i; LCD_CS_Clr(); for(i=0;i<8;i++) { LCD_SCLK_Clr(); if(dat&0x80) { LCD_MOSI_Set(); } else { LCD_MOSI_Clr(); } LCD_SCLK_Set(); dat<<=1; } LCD_CS_Set(); } /****************************************************************************** 函数说明:LCD写入数据 入口数据:dat 写入的数据 返回值: 无 ******************************************************************************/ void LCD_WR_DATA8(u8 dat) { LCD_Writ_Bus(dat); } /****************************************************************************** 函数说明:LCD写入数据 入口数据:dat 写入的数据 返回值: 无 ******************************************************************************/ void LCD_WR_DATA(u32 dat) { LCD_Writ_Bus(dat>>16); LCD_Writ_Bus(dat>>8); LCD_Writ_Bus(dat); } /****************************************************************************** 函数说明:LCD写入命令 入口数据:dat 写入的命令 返回值: 无 ******************************************************************************/ void LCD_WR_REG(u8 dat) { LCD_DC_Clr();//写命令 LCD_Writ_Bus(dat); LCD_DC_Set();//写数据 } /****************************************************************************** 函数说明:设置起始和结束地址 入口数据:x1,x2 设置列的起始和结束地址 y1,y2 设置行的起始和结束地址 返回值: 无 ******************************************************************************/ void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2) { LCD_WR_REG(0x2a);//列地址设置 LCD_WR_DATA8(x1>>8); LCD_WR_DATA8(x1); LCD_WR_DATA8(x2>>8); LCD_WR_DATA8(x2); LCD_WR_REG(0x2b);//行地址设置 LCD_WR_DATA8(y1>>8); LCD_WR_DATA8(y1); LCD_WR_DATA8(y2>>8); LCD_WR_DATA8(y2); LCD_WR_REG(0x2c);//储存器写 } void LCD_Init(void) { LCD_GPIO_Init();//初始化GPIO LCD_RES_Clr();//复位 FL_DelayMs(100); LCD_RES_Set(); FL_DelayMs(100); LCD_BLK_Set();//打开背光 FL_DelayMs(100); //************* Start Initial Sequence **********// LCD_WR_REG(0x11); //Sleep out FL_DelayMs(120); //Delay 120ms //************* Start Initial Sequence **********// LCD_WR_REG(0XF2); LCD_WR_DATA8(0x18); LCD_WR_DATA8(0xA3); LCD_WR_DATA8(0x12); LCD_WR_DATA8(0x02); LCD_WR_DATA8(0XB2); LCD_WR_DATA8(0x12); LCD_WR_DATA8(0xFF); LCD_WR_DATA8(0x10); LCD_WR_DATA8(0x00); LCD_WR_REG(0XF8); LCD_WR_DATA8(0x21); LCD_WR_DATA8(0x04); LCD_WR_REG(0X13); LCD_WR_REG(0x36); // Memory Access Control if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x08); else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC8); else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x78); else LCD_WR_DATA8(0xA8); LCD_WR_REG(0xB4); LCD_WR_DATA8(0x02); LCD_WR_REG(0xB6); LCD_WR_DATA8(0x02); LCD_WR_DATA8(0x22); LCD_WR_REG(0xC1); LCD_WR_DATA8(0x41); LCD_WR_REG(0xC5); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x18); LCD_WR_REG(0x3a); LCD_WR_DATA8(0x66); FL_DelayMs(50); LCD_WR_REG(0xE0); LCD_WR_DATA8(0x0F); LCD_WR_DATA8(0x1F); LCD_WR_DATA8(0x1C); LCD_WR_DATA8(0x0C); LCD_WR_DATA8(0x0F); LCD_WR_DATA8(0x08); LCD_WR_DATA8(0x48); LCD_WR_DATA8(0x98); LCD_WR_DATA8(0x37); LCD_WR_DATA8(0x0A); LCD_WR_DATA8(0x13); LCD_WR_DATA8(0x04); LCD_WR_DATA8(0x11); LCD_WR_DATA8(0x0D); LCD_WR_DATA8(0x00); LCD_WR_REG(0xE1); LCD_WR_DATA8(0x0F); LCD_WR_DATA8(0x32); LCD_WR_DATA8(0x2E); LCD_WR_DATA8(0x0B); LCD_WR_DATA8(0x0D); LCD_WR_DATA8(0x05); LCD_WR_DATA8(0x47); LCD_WR_DATA8(0x75); LCD_WR_DATA8(0x37); LCD_WR_DATA8(0x06); LCD_WR_DATA8(0x10); LCD_WR_DATA8(0x03); LCD_WR_DATA8(0x24); LCD_WR_DATA8(0x20); LCD_WR_DATA8(0x00); LCD_WR_REG(0x11); FL_DelayMs(120); LCD_WR_REG(0x29); LCD_WR_REG(0x2C); } main   Display_GB2312_String(10,50,32, "祝大家冬至吃水饺",WHITE,BLACK); Display_GB2312_String(10,100,32, "祝大家冬至吃水饺",RED,BLACK); Display_GB2312_String(10,150,32, "祝大家冬至吃水饺",BLUE,BLACK); Display_GB2312_String(10,200,32, "祝大家冬至吃水饺",GREEN,BLACK); 效果如下: 测试视频: 总结:库函数跟STM32命名和其他底层驱动略有不同,需要耐心细致。

统计信息

已有75人来访过

  • 芯积分:90
  • 好友:--
  • 主题:22
  • 回复:16
  • 课时:--
  • 资源:1

留言

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


现在还没有留言