tag 标签: MM32

相关博文
  • 热度 7
    2023-1-6 18:12
    982 次阅读|
    0 个评论
    【灵动微电子 L0136 温控器/遥控器应用】 单色液晶驱动(段式)
    目录 一、简介 二、 环境搭建 三、SLCD 显示 一、 简介 1、 MM 32L0130 MM32L0130 微控制器搭载 Arm Cortex-M0+ 内核,最高工作频率可达 48MHz 。 内 置 64KB 高速存储器,并集成了丰富的 I/O 端口和外设模块。 该 产品包含 1 个 12 位的 ADC 、 1 个 比较器、 2 个 16 位通用定时器、 2 个 16 位基本定时器、 1 个 低功耗定和 1 个 RTC 计数器,还包含标准的通信接口: 2 个 UART 接口、 1 个 低功耗 UART 接口、 2 个 SPI 接 口、 2 个 I2S 接口和 1 个 I2C 接口。此外,本产品还内置了 段码式 液晶驱动模块( SLCD ) 和红外信号调制模块( IRM ) 。 2、 SLCD MM32L0130 微控制器 中搭载的 SLCD 驱动器是用于单色无源液晶显示器( SLCD )的数字驱动器,具有多达 8 个 公共端和多 达 63 个 分段端, SLCD 引脚最多为 64 个 ,因此最多可驱动 240 ( 60x4 )或 448 ( 56x8 ) 个 段码。 驱动段码的 最终数量由产品规格书中设备引脚的数目决定。 其技术特征如下所示: 显示帧率灵活 控制 ; 兼容 APB 接口 ; 支持静态、 1/2 、 1/3 、 1/4 、 1/6 和 1/8 占空比 ; 支持 1/2 、 1/3 和 1/4 偏置电压设置 ; 为了存储显示数据,内置了 16*32bit 显示数据寄存器 ; 通过软件来调整 SLCD 输出电压,来调节对比度 ; 外围电路简单,不需要模拟器件支持 ; 1 )内嵌电容升压器来得到比电源电压更高而且不受其影响的 SLCD 驱动电压。升压器产生的 SLCD 驱动电压范围可调,可以匹配支持 3V 或者 5V 的 LCD 屏幕 2 ) SLCD 驱动电源可以通过软件来选择内部电源或外部电源。 3 )可以选择使用内嵌电容分压器对 SLCD 驱动电压进行分压,得到驱动电压的中间值 (VLCDrail1 , VLCDrail2 , VLCDrail3 , VLCDrail4) 。 两种调整显示对比度的方法 ; 1 )当采用内部升压器来提供 VLCD 电源时,可以通过软件调节 VLCD 输出电压 2 )其它情况下可以在每帧显示之间插入死区时间 ; 支持以下低功耗模式:低功耗运行模式,睡眠模式,低功耗睡眠模式,停止模式,深度停止模式,待机模式;在不需要显示的时候,可以完全关闭 SLCD 驱动以达到降低功耗的目的 ; 支持相位反转模式,降低功耗和 EMI ; 每一帧显示开始的时候,通过中断信号与软件同步,更新显示数据 ; 闪烁功能 1 )可以从 所有段码中 任意选择 1 到 8 个段码 闪烁显示,也可以闪烁显示 全部段码 。 2 )在静态、 1/2 、 1/3 、 1/4 占空比模式下可以闪烁显示任意段码 。 3 )软件选择闪烁频率,支持闪烁频率 0.5Hz, 1Hz, 2Hz 或 4Hz 。 灵活的引脚复用功能,可以配置任意 LCD 驱动引脚成为 COM 或者 SEG 功能 , SLCD 的驱动引脚在没有被配置成 SLCD 功能的时候,可以作为 GPIO 引脚来使用 ; SLCD 驱动电平( VLCDrail1 , VLCDrail2 , VLCDrail3 , VLCDrail4 )的去耦合功能 支持低功耗驱动波形 ; 支持 DMA 传输 ; 支持中断 ( 帧结束 中断( End of frame ) 、 闪烁周期中断( Blink cycle ) ) ; 二、 环境搭建 本次评测 的 EVB -L0136 开发板 上板载的 MCU为MM 32L0136C7P , 为了测试M M32 L 0136 的SLCD液晶驱动器。本次测试使用的开发环境为MDK -ARM Kei l 5.34 。搭建的步骤如下: 资料下载; MM 32L0130 资料链接: https://www.mindmotion.com.cn/products/mm32mcu/mm32l/new_mm32l0/mm32l0130/ EV Board (MM32L0136C7P) 资料链接: https://www.mindmotion.com.cn/support/development_tools/evaluation_boards/evboard/mm32l0136c7p/ Keil Pack 支持包链接: https://www.mindmotion.com.cn/support/software/keil_pack/ 注: Jl ink 无法识别MM 32L0130 ,在设备支持包内有驱动 ( MM32_PACKAGE_Segger.exe ) ,需要自行安装。 搭建工程 本次工程直接在MM 32 SDK 软件库中的SLCD例程的基础上进行修改。 其工程配置如下图所示: 三 、 SLCD 显示 1 、硬件连接 EVB -L0136 的 SLCD引脚连接 原理图如下图: 由图可知,段式液晶的1 0 、1 1 、2 3 引脚并未与MCU连接, 因此 对应的有 段式液晶的S 5 -S 8 、L1 -L4 、W2 -W5 段码 无法 点亮,注意使用时应 将开发板中SW1、SW2、SW3、SW4开关 全部拨于左侧 。 2、S LCD 驱动器 SLCD 驱动模块包括以下几个基本的子模块 ( SLCD 输出驱动引脚 、 时钟产生单元 、 内置升压电荷泵 、 偏置电压生成单元 、 时序控制和波形发生器 ) ,如下图所示。 在MM 32 L 0136 中 SLCD 驱动模块内置了 16 个 32 比特显示数据寄存器。显示数据寄存器中的 比特位 与 LCD 显示屏上 的段码一一对应 ,如果要点亮 LCD 显示屏上的某个段 码,则需要把显示数据寄存器中的相对应的比特写为 ‘1’ ;反之如果要熄灭某个段码,则需要把对应的比特写为 ‘0’ ,如下图所示。 并且在不同的工作模式下,还可以划分为主 / 辅显示寄存器 ( 为了避免在写入显示数据寄存器的时候影响 LCD 屏幕的显示 ) ,其主要对应关系如下: 模式 SLCD_DR SLCD_DR 片区 s tatic 、 1/2 、 1/3 和 1/4 duty 模式 辅助显示寄存器 主显示寄存器 1/6 和 1/8 duty 模式 主显示寄存器 主显示寄存器 还有 闪烁显示数据寄存器 等寄存器 ,请读者参考数据手册。 3、驱动程序 根据上图SLCD的段码与引脚对应关系可以得出,SEG1-SEG4、SEG5-SEG10对应的数字的段码分别为: /* 0 1 2 3 4 5 6 7 8 9 - NULL*/ const uint8_t slcd_up_seg_number_map = {0XEB,0X60,0XC7,0XE5,0X6C,0XAD,0XAF,0XE0,0XEF,0XED,0X40,0x00}; /* 0 1 2 3 4 5 6 7 8 9 - NULL*/ const uint8_t slcd_main_seg_number_map = {0X7D,0X60,0X3E,0X7A,0X63,0X5B,0X5F,0X70,0X7F,0X7B,0X20,0x00}; 建立一个结构体,用结构体存放每一个段码的信息( 可以直接修改结构体的内容从而显示屏幕的信息 ),结构体如下所示: typedef struct { union { struct { uint8_t dp1_flag:1; uint8_t dp2_flag:1; uint8_t dp3_flag:1; uint8_t dp5_flag:1; uint8_t dp6_flag:1; uint8_t dp7_flag:1; uint8_t dp8_flag:1; uint8_t dp9_flag:1; } slcd_dp_bit; uint8_t data; } un_slcd_dp; union { struct { uint8_t s1_flag:1; uint8_t s2_flag:1; uint8_t s3_flag:1; uint8_t s4_flag:1; uint8_t s5_flag:1; // HardWare DisAble uint8_t s6_flag:1; // HardWare DisAble uint8_t s7_flag:1; // HardWare DisAble uint8_t s8_flag:1; // HardWare DisAble } slcd_s_bit; uint8_t data; } un_slcd_s; union { struct { uint16_t l1_flag:1; // HardWare DisAble uint16_t l2_flag:1; // HardWare DisAble uint16_t l3_flag:1; // HardWare DisAble uint16_t l4_flag:1; // HardWare DisAble uint16_t w1_flag:1; uint16_t w2_flag:1; // HardWare DisAble uint16_t w3_flag:1; // HardWare DisAble uint16_t w4_flag:1; // HardWare DisAble uint16_t w5_flag:1; // HardWare DisAble uint16_t t1_flag:1; uint16_t col1_flag:1; uint16_t col2_flag:1; uint16_t col3_flag:1; uint16_t s9_flag:1; uint16_t nouse_flag:2; } slcd_col_w_l_s9_bit; uint16_t data; } un_slcd_col_w_l_s9; uint8_t slcd_up_seg_buffer ; uint8_t slcd_main_seg_buffer ; } str_slcd_buffer; 显示时候,需要将每一个COM口对应 的段码所 对应的位置依次存放如对应的比特位。 首先建立一个 d isplay _b uffer , 每个数据中存入4个比特的数据,在显示的时候移入数据显示寄存器。其驱动代码如下所示: void slcd_refresh(void) { uint8_t seg_y = 0u,i = 0u; uint8_t display_buffer ; uint32_t com_x; SLCD_ClearAllSegBits(BOARD_SLCD_PORT); for(i = 0 ; i<4; i++) { display_buffer = slcd_up_seg_number_map ]&0X0F; 4) &0X0F; } // dot flag driver display_buffer |= slcd_buffer.un_slcd_dp.slcd_dp_bit.dp1_flag ; display_buffer |= slcd_buffer.un_slcd_dp.slcd_dp_bit.dp2_flag ; display_buffer |= slcd_buffer.un_slcd_dp.slcd_dp_bit.dp3_flag ; display_buffer |= slcd_buffer.un_slcd_col_w_l_s9.slcd_col_w_l_s9_bit.col1_flag ; for(i = 0 ; i<3; i++) { display_buffer = slcd_main_seg_number_map ]&0X0F; 4) &0X0F; } for(i = 3 ; i<6; i++) { display_buffer = slcd_main_seg_number_map ]&0X0F; 4) &0X0F; } // dot flag driver display_buffer |= slcd_buffer.un_slcd_dp.slcd_dp_bit.dp5_flag<<3 ; display_buffer |= slcd_buffer.un_slcd_dp.slcd_dp_bit.dp6_flag<<3 ; display_buffer |= slcd_buffer.un_slcd_dp.slcd_dp_bit.dp7_flag<<3 ; display_buffer |= slcd_buffer.un_slcd_dp.slcd_dp_bit.dp8_flag<<3 ; display_buffer |= slcd_buffer.un_slcd_dp.slcd_dp_bit.dp9_flag<<3 ; display_buffer |= slcd_buffer.un_slcd_col_w_l_s9.slcd_col_w_l_s9_bit.s9_flag<<3 ; display_buffer = (slcd_buffer.un_slcd_col_w_l_s9.slcd_col_w_l_s9_bit.w1_flag<<3)|(slcd_buffer.un_slcd_col_w_l_s9.slcd_col_w_l_s9_bit.t1_flag<<2)| (slcd_buffer.un_slcd_col_w_l_s9.slcd_col_w_l_s9_bit.col2_flag<<1)|(slcd_buffer.un_slcd_col_w_l_s9.slcd_col_w_l_s9_bit.col3_flag); display_buffer = (slcd_buffer.un_slcd_s.slcd_s_bit.s1_flag<<3)|(slcd_buffer.un_slcd_s.slcd_s_bit.s2_flag<<2)| (slcd_buffer.un_slcd_s.slcd_s_bit.s3_flag<<1)|(slcd_buffer.un_slcd_s.slcd_s_bit.s4_flag); for (com_x = 0u; com_x < BOARD_SLCD_COM_NUM; com_x++) { slcd_seg_bits = 0u; slcd_seg_bits = 0u; for (seg_y = 0u; seg_y < 22u; seg_y++) { if (slcd_seg_pin_buff < 32u) { com_x)&0x01) << slcd_seg_pin_buff ); /* Segment 0 ~ 31 bit mask. */ } else { com_x)&0x01) << (slcd_seg_pin_buff - 32u) ); /* Segment 32 ~ 63 bit mask. */ } } /* Set COMx segment bits to display. */ SLCD_SetCOMxSegBits(BOARD_SLCD_PORT, com_x, (uint32_t * )slcd_seg_bits); } } 4、显示效果 显示效果如下所示: http:// 以上的Demo: https://mbb.eet-china.com/download/299510.html
  • 热度 5
    2020-11-30 15:56
    3233 次阅读|
    2 个评论
    sudo apt-get update sudo apt-get install automake bison build-essential flex gcc-arm-none-eabi gperf git libncurses5-dev libtool libusb-dev libusb-1.0-0-dev minicom sudo apt-get install gedit mkdir nuttxspace cd nuttxspace git clone http://repo.or.cz/r/openocd.git cd openocd ./bootstrap ./configure --enable-internal-jimtcl --enable-maintainer-mode --disable-werror --disable-shared --enable-stlink --enable-jlink --enable-rlink --enable-vsllink --enable-ti-icdi --enable-remote-bitbang make sudo make install cd .. git clone https://bitbucket.org/nuttx/tools cd tools cd kconfig-frontends ./configure make sudo make install sudo ldconfig cd .. mkdir nuttx-7.7 cd nuttx-7.7 git clone https://github.com/apache/incubator-nuttx-apps git clone https://github.com/apache/incubator-nuttx //---rename apps and nuttx cd nuttx cd tools ./configure.sh stm32_tiny/nsh cd .. make menuconfig
  • 热度 25
    2020-6-21 15:35
    1781 次阅读|
    0 个评论
    【MM32 eMiniBoard】评测一 灵动微蓝牙服务实现点灯
    蓝牙发展到今天,有太多新特性了,去年年底( 2019/12/31 )推出的蓝牙 5.2 再一次更新了 HCI 物理特性,包括多重串流音频、低功耗音频解码器 LC3 、广播音频等等新特性,各家厂商也未停下创新的脚步,手头上的 MM32W373 就是集成了巨微集成电路的蓝牙射频方案的 Cortex –M3 内核主控的 BLE SoC 。由于是方案集成,加之刚入局,所以一些东西在蓝牙这块有待整理,规格书全文都少提蓝牙规格,都是在讲 MCU 那块, BLE 方面的 SDK 也是没有,只是放出一个乱七八糟的例程: 1. 接口混乱,比如蓝牙接口居然有两个版本,但却同时存在,具体 app_hogo.c 和 app.c 定义重复,前者是新版本 5.3.1 ,后者是 2.0.1 旧版本。还有一些 ATT 属性句柄明显访问不到,定义失误,比如 softwareRevision(0x2a28) 。 2. 写的非蓝牙部分也是混乱,比如 uart.c 里 uart_initwBaudRate 函数惨传进来的参数没有用到,但使用的时候又偏偏传进来了一个无用的参数。 3. 文档也是混乱 MiniBoard 和 eMiniBoard ,又是 MM373W 和 MMW373L 。也是待整理。 言归正传,由于蓝牙都是基于 service 来处理,而恰巧有一个 LED Service ,就来点灯看看,所有的 API 都放在 mg_api.h (进一步实锤是 MacroGiga 巨微写的 API ),实现全部开放,做成静态库 .lib (有 OTA 、连接、 dtm 检测定频 3 个库)分别对应 mg_BLEOTA_lib_m3.lib 、 mg_BLEpair_lib_m3.lib 、 mg_TEST_Lib.lib ,可供使用的 API 也只能修改广播类型( ble_set_adv_type )、广播间隔( ble_set_interval )、广播名称( ble_set_name )等,涉及到广播角色、连接参数、信号确认、连接状态机等很多关键过程全都没有,所以只能等待后续更新了。主框架是 3 个函数: 1) SetBleIntRunningMode :设置中断 SVC 和协议栈通信 2) radio_initBle :设置默认发射功率和 MAC 3) ble_run_interrupt_start :中断方式开启协议栈广播工作 看不到任何 GATT 、 GAP 初始化设置等等步骤,但 service 、 att 的声明也有,所以可以去添加自己的特征值,具体文件 app_hogo.c 里数组 AttCharList 就是所有服务、特征的声明,比如 0x2a29 对应 Manufactuer Name , 0x2a26 对应 Firmware Revision , 0x2a28 对应 0x2a28 : 因为是写属性,干脆就以第二个特征属性来操作,它的 properties 就有写和无回复写,修改句柄范围为 0x16 到 0x17 ,然后在写回调 ser_write_rsp 里添加操作内容: 实际操作如下(操作 LD2 绿灯,对应 PC10 ) , 开灯 : 关灯 其他修改名称、间隔、 MAC 、发射功率也都可以改,比如改名字( URL 编码): 也可 AT 指令动态修改: 不过时机不对会让协议栈工作不正常。高级特性 mesh 暂时官方没更新, OTA 还没试,暂且这样。
  • 热度 27
    2020-6-6 19:46
    2115 次阅读|
    0 个评论
    【MM32 eMiniBoard】01.开箱:板载部分硬件测试
    【 MM32 eMiniBoard 】 01. 开箱:板载部分硬件测试 写在前面的话 这一年因为工作需要,开始接触无线通信方面的工作,越来越多的了解和接触到关于无线通信的知识点,也为各种数据通信方式而苦恼。这次无意看到面包板上的 MM32W3 开发板评测活动,被其内置蓝牙模块所吸引,随后申请并有幸被选中为体验者之一,非常激动。 开箱 开箱入眼就是这样一个小板子安静的躺在包装盒内: 拿出板子和卡片,背面如下,我估计这类开发板现在都是这样设计的包装了,正面板子芯片资源介绍,背面产品推广广告。 板子真容如下,背面就不往上放了,相机效果太差。 下面这个按键设计是我比较喜欢的地方,侧边放置,侧面按压,虽然实际使用效果一般,但是这个设计还是很 NICE。 开发板简介(手册搬运) MM32 eMiniBoard 蓝牙开发板,这个板子的名字基本上包含了芯片的一切特点,内核、特色资源(蓝牙)。 MM32 eMiniBoard 蓝牙开 发板具有如下特点: 支持 MindMotion MM32 Cortex-M 系列 MCU 开发评估 支持 Keil uVision v5.0 / IAR EWARM v7.80 以上的集成开发环境 支持 MindMotion MM32 FDS 固件开发平台 支持 MindMotion MM32 Program 编程软件 开发板 MCU 供电电源基于 3.3V 电压设计 支持高达 4KV EFT 抗干扰能力 Insight 系列 MM32 eMiniBoard 开发板用户手册 v0.90 内嵌 MM32-LINK-OB 在线仿真器,支持 SWD 调试接口以及智能连接的 CDC 虚拟串口 仿真器 USB 接口或目标 MCU USB 接口供电 4- 侧贴按键 4-LED 1-UART 连接器 1 无源扬声器 1-USB 连接器 1-16Mbit 的 SPI Flash 存储器 1-2048bit 的 I2C 存储器 1 模拟输入电位器 1 个内置扩展功能和 MCU 引脚功能选择开关与 MCU 管脚相同 ( 部分功能引脚未引出 ) 的 0.1 英寸间距的双排直针插座 芯片简介(手册搬运) MM32W3 系列是超低功耗的单模蓝牙芯片,射频采用 2.4GHz ISM 频段的频率, 2MHz 信道间隔,符合蓝牙规范。 MM32W373PSB 使用高性能的 ARM® Cortex®-M3 为内核的 32 位微控制器,最高工作频率可达 96MHz ,内置高速存储器,丰富的增强型 I/O 端口和外设连接到两条 APB 总线。 灵动微 MM32W373PSB 包含 2 个 12 位 ADC 、 2 个 12 位的 DAC 、 3 个 16 位通用定时器和 1 个 PWM 高级定时器,还包含标准的通信接口: 3 个 UART 接口、 2 个 I2C 接口、 1 个 SPI 接口和 1 个 USB 接口。 MM32W3 产品系列工作电压为 2.3V ~ 3.9V ,工作温度范围包含 -40 ℃ ~ +85 ℃常规型。多种省电工作模式保证低功耗应用的要求。 外设1:LED+KEY 进入正题,板载外设KEY+LED,这部分具体可参考上图KEY特写部分,原理图如下 LED的原理图还好,KEY的图就有点惨不忍睹了,连线混乱,看的我眼花缭乱,半天愣是没看出他的接线方式,上下拉方式我都分不清楚,确实不应该。 调试这个几个KEY真的浪费了点时间,但是还好,经过不懈学习总算搞懂它们了。 部分驱动程序如下: GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN; // 设置按键的引脚为浮空输入 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPD; //选择按键的引脚 GPIO_InitStructure.GPIO_Pin = KEY2_GPIO_PIN ; //设置按键的引脚为浮空输入 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //选择按键的引脚 GPIO_InitStructure.GPIO_Pin = KEY3_GPIO_PIN ; //设置按键的引脚为浮空输入 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //选择按键的引脚 GPIO_InitStructure.GPIO_Pin = KEY4_GPIO_PIN ; //设置按键的引脚为浮空输入 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; /* * 函数名:Key1_Scan * 描述 :检测是否有按键按下 * 输入 :GPIOx:x 可以是 A,B,C,D或者 E * GPIO_Pin:待读取的端口位 * 输出 :KEY_OFF(没按下按键)、KEY_ON(按下按键) */ uint8_t Key1_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin) { /*检测是否有按键按下 */ if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY1_ON ) { /*等待按键释放 */ while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY1_ON); return KEY1_ON; } else return KEY1_OFF; } /* * 函数名:Key_Scan * 描述 :检测是否有按键按下(Key2,Key3,Key4) * 输入 :GPIOx:x 可以是 A,B,C,D或者 E * GPIO_Pin:待读取的端口位 * 输出 :KEY_OFF(没按下按键)、KEY_ON(按下按键) */ uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin) { /*检测是否有按键按下 */ if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON ) { /*等待按键释放 */ while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON); return KEY_ON; } else return KEY_OFF; } 这里面自己宏定义的地方比较多,所以.h文件就不贴了,我把程序整理一下,工程直接发出来给大家参考。 这里要解释一下Buzzer这一部分,之所以加在这里是因为前面以为它是有源蜂鸣器,所以直接当LED驱动了。具体看后面蜂鸣器的驱动。 KEY这里主要看一下一脚设置模式和扫描函数就好,比较简单,就不多说了 GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN; // 设置按键的引脚为浮空输入 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPD; //选择按键的引脚 GPIO_InitStructure.GPIO_Pin = KEY2_GPIO_PIN ; //设置按键的引脚为浮空输入 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //选择按键的引脚 GPIO_InitStructure.GPIO_Pin = KEY3_GPIO_PIN ; //设置按键的引脚为浮空输入 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //选择按键的引脚 GPIO_InitStructure.GPIO_Pin = KEY4_GPIO_PIN ; //设置按键的引脚为浮空输入 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; /* * 函数名:Key1_Scan * 描述 :检测是否有按键按下 * 输入 :GPIOx:x 可以是 A,B,C,D或者 E * GPIO_Pin:待读取的端口位 * 输出 :KEY_OFF(没按下按键)、KEY_ON(按下按键) */ uint8_t Key1_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin) { /*检测是否有按键按下 */ if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY1_ON ) { /*等待按键释放 */ while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY1_ON); return KEY1_ON; } else return KEY1_OFF; } /* * 函数名:Key_Scan * 描述 :检测是否有按键按下(Key2,Key3,Key4) * 输入 :GPIOx:x 可以是 A,B,C,D或者 E * GPIO_Pin:待读取的端口位 * 输出 :KEY_OFF(没按下按键)、KEY_ON(按下按键) */ uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin) { /*检测是否有按键按下 */ if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON ) { /*等待按键释放 */ while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON); return KEY_ON; } else return KEY_OFF; } 外设2:蜂鸣器 这次开箱测试,蜂鸣器当然必不可少。可是用高低电平驱动时,发现蜂鸣器竟然不会叫。随后仔细查看资料后发现,这个蜂鸣器是无源蜂鸣器,且硬件驱动方式也比较特殊。有个直 流隔离电 容。电路如图所示。 蜂鸣器是普通无源蜂鸣器,或者说就是类似于电脑的扬声器。单片机 I/O 口来的是一定频率的交流信号,也就是正半周高电位,负半周低电位(接地或者负电压),这样在正半周时有电流流过三极管 B-E 间,三极管导通,低电位时给电容放电,同时三极管截止。 二极管的作用是吸收蜂鸣器线圈的反响脉冲避免损坏三极管(和继电器上并联二极管道理一样)这样,就可以通过软件控制让单片机 I/O 口输出不同频率方波,蜂鸣器就能发出不同频率的声音。不仅仅局限于一般有源蜂鸣器的单调滴滴声,通过软件设计可以有不同频率的操作音,持续的报警音,甚至是一首“ 致爱丽丝 ”乐曲。 这两端话是我在网上看到的,直接复制粘贴过来了,感觉解释的很到位,和这块板子就是差个驱动MOS管,但其实是一样的。置于效果呢,我从网上找了两个音乐素材(欢乐颂、遇见),拍了个视频有点大,后面看看能不能上传上来,或者有兴趣也可以下载程序自己体验一下,还是挺好玩的。 这些程序就不贴了,我会把工程文件直接放上来。 外设3:EEPROM(I2C) I2C这里,没什么亮点,芯片硬件配置的我头大,最后还是用模拟的方式,一次成功。 电路什么的我就不放上来了,效果图如下: 到这里我的这个测试基本上就要结束了,因为板载外设资源HK25Q16C和ADC电压采集部分,我搞了两天,也没搞出个结果,所以后面再说; 然后再说一下,后面主要再围绕蓝牙模块做个评测,因为这个才是我最关心的东西,也是厂家的亮点,一定要有。 最后,工程文件上传一下。
  • 热度 29
    2020-6-2 13:36
    2309 次阅读|
    0 个评论
    【MM32 eMiniBoard】基于上海灵动微电子的M3核心的 低功耗蓝牙上手分享
    【 MM32 eMiniBoard 】基于上海灵动微电子的 M3 核心的 低功耗蓝牙上手分享 经过一段时间的等待,在 面包板社区申请的灵动微电子的 M3 核心的 mm32w373 低功耗蓝牙芯片的评测板终于到了, 最近刚好有点多余时间,顺便准备下方案,以备后续的产品应用跟快速。 首先看下板子的整体 这个板子是集成了 MM32link 的,方便同学们下载测试 这个板子能做的测试有 1,12 位 ad 测试, 2,按键测试, 3,流水灯测试, 4,蜂鸣器测试, 5,串口测试, 6,spi 测试, 7,iic 测试灯, 有了这些外围。我们可以很方便的移植个操作系统。做多任务测试。 既然是蓝牙版,首先就是测试蓝牙, 开发环境 keil5.17 之前的灵动 M0 测试板我已经安装, 这次只要下载 灵动 M3 的驱动包安装就可以, 1 到灵动官网下载当前是 MM32_KEIL_Pack_Ver1.39.ZIP 2 包含全部灵动驱动包 这次安装 MindMotion.MM32W3xxB_DFP.1.0.7.pack 3 到官网下载蓝牙软件评估工程 MM32W3xxxxB_n_samplecode-master.zip Keil 打卡工程后提示 MCU 型号错误,不要着急,第一步直接编译通过, 第二部,设置调整 CPU 型号,选择 MM32W373, 从新编译,通过。 链接开发板,原始程序 4 个灯亮,按一次按键,对应的灯改变, 下载新程序后,四个灯不亮, 赶紧打开手机,搜索蓝牙,发现了 MM32 蓝牙信号,点击链接,链接成功, UUID 1800 添加 LED 子程序模块,从 MM32 103 版程序中复制 LED 程序文件到 HARDWARE ,修改端口 , 修改闪灯时间。编译下载,灯可以闪了。 官方程序是封装的库,为了显示我们能运用蓝牙,总要拿来做点什么, 我就把蓝牙的名字修改成 MINDMOTION_RAD ,增加了三个字母。 从新编译,下载。运行。 联机正常,名称已经更改,蓝牙上电终于通过, 接下来我们还有很补蓝牙网络知识。 谢谢灵动微电子
相关资源