[i=s] 本帖最后由 letchgo 于 2025-6-15 11:16 编辑 [/i]<br />
<br />
1、概述
(1)本次测评基于MM32F0121C6PV开发板进行的,该芯片的资源是64K flash和8K RAM。


(2)初次使用MM32芯片,此前已经很久没有使用MDK进行开发,因此在编译和搭建环境花了不少时间。建议MM32后续也增加gcc的例程及相关的ld文件。
(3)本帖主要是记录遇到的问题,同时反馈测评结果。
(4)代码目录构成

2、基础测试
2.1 说明
整体代码基本上都是移植lib_sample中代码整合成一个工程。
2.2 搭建开发环境
由于一直使用makefile开发,但是mm32 的gcc的ld文件不好找,时间短,便使用keil进行开发,重新安装了下keil,遇到了一些问题。环境搭建好之后,随便打开一个demo,配置烧写器一些参数,如下图:

2.3 SPI及flash读写测试
W25Q特性介绍●SPI串行存储器系列 -W25Q64:64M 位/8M 字节 -W25Q16:16M 位/2M 字节 -W25Q32:32M 位/4M 字节 -每 256 字节可编程页
●高性能串行Flash存储器 -比普通串行Flash性能高6倍 -80MHz时钟频率 -双倍SPI相当于160MHz -四倍SPI相当于320MHz -40MB/S连续传输数据 -30MB/S随机存取(每32字节) -比得上16位并行存储器
●灵活的4KB扇区结构 -统一的扇区擦除(4K 字节) -块擦除(32K 和 64K 字节) -一次编程 256 字节 -至少 100,000 写/擦除周期 -数据保存 20 年 ●标准、双倍和四倍SPI -标准 SPI:CLK、CS、DI、DO、WP、HOLD -双倍 SPI:CLK、CS、IO0、IO1、WP、HOLD -四倍 SPI:CLK、CS、IO0、IO1、IO2、IO3
●高级的安全特点 -软件和硬件写保护 -选择扇区和块保护 -一次性编程保护(1) -每个设备具有唯一的64位ID(1)
代码片段:
void plt_itf_setup_w25q(void)
{
mc_w25q_config config;
SPI_Configure();//spi硬件初始化
config.write_block = spi_read_write_byte;
config.enable_gpio_cb = mc_enable_w25q;
config.disable_gpio_cb = mc_disable_w25q;
if (mc_w25q_setup(config) == 0x00)
{
printf("w25q init failed\r\n");
}
else
{
printf("w25q init success\r\n");
}
test_w25qxx_readwrite();//测试
}
测试结果:
通过写入和读取的数据对比得出是否成功:

2.4 串口打印
使用自带的串口进行打印

2.5 呼吸灯实验
void plt_itf_breathlight_set(uint16_t duty)
{
TIM_SetCompare3(TIM1, (uint32_t)duty * get_time_period() / 1000);
}
#define BREATH_DELAY 8
void plt_itf_breathlight_run(void)
{
static uint16_t duty_breath = 0;
static uint8_t type_run = 0;
if (duty_breath <= 10)
{
type_run = 0;
}
else if (duty_breath > (1000-BREATH_DELAY))
{
type_run = 1;
}
if (type_run == 0)
{
duty_breath += BREATH_DELAY;
}
else if (type_run == 1)
{
if (duty_breath >= BREATH_DELAY)
{
duty_breath -= BREATH_DELAY;
}
}
plt_itf_breathlight_set(duty_breath);
}
2.6 ADC实验
读取板载的一个转盘ADC实验,顺时针和逆时针转动,串口打印adc数据。
void plt_adc_init(void)
{
drv_adc_init();
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
void plt_itf_adc_run(void)
{
// while (RESET == ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC))
// {
// }
ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
Voltage = (float)ADC_GetChannelConvertedValue(ADC1, ADC_Channel_3) * (float)3.3 / (float)4096.0;
}
int16_t plt_adc_volatge(void)
{
return(int16_t)(Voltage*1000);
}

2.7 RTC实验
通过串口打印读取时间戳
typedef struct
{
uint16_t year;
uint8_t month;
uint8_t day;
uint8_t week;
uint8_t hour;
uint8_t minute;
uint8_t second;
} rtc_calendar_data_t;
void plt_itf_rtc_printf(void);
void plt_itf_rtc_init(void);
void plt_itf_set_rtc_timer(uint16_t Year, uint8_t Month, uint8_t Day, uint8_t Hour, uint8_t Minute, uint8_t Second);
void plt_itf_get_rtc_timer(rtc_calendar_data_t *RTC_Calendar);

2.8 I2C实验
I2C实验主要是驱动板载的EEROM-24c02,进行简单的读写测试
(1)AT240C02 EEPROM介绍
- 宽范围的工作电压1.8V~5.5V低电压技术
- 1mA典型工作电流- 1uA典型待机电流·存储器组织结构
- 24C02,256 X8(2K bits)- 24C04,512×8(4K bits)- 24C08,1024 × 8 (8K bits)-24C16,2048 ×8(16K bits)-24C32,4096 X8(32K bits)- 24C64,8192 × 8(64K bits)
- 2线串行接口,完全兼容l2C总线
- I2C时钟频率为1 MHz (5V),400 kHz (1.8V,2.5V,2.7V)施密特触发输入噪声抑制
- 硬件数据写保护
- 内部写周期(最大5 ms)可按字节写
- 页写:8字节页(24C02),16字节页(24C04/08/16),32字节页(24C32/64)可按字节,随机和序列读
- 自动递增地址
- 高可靠性擦写寿命:100万次-数据保持时间:100年

有规格书可知,EEPROM的读写速率是100KHZ.
(2)与flash的区别

(3)测试结果

(4)部分代码
void plt_itf_eerom_test(void)
{
uint8_t i = 0;
uint8_t ReadBuffer[30]={0x00}, WriteBuffer[30]={"Hello 21ic, Hello MM32F0121"};
printf("\r\nTest %s", __FUNCTION__);
printf("\nEEPROM Write : ");
plt_itf_eerom_write(0, WriteBuffer, 30);
printf("\nEEPROM Read : \r\n");
plt_itf_eerom_read(0, ReadBuffer, 30);
printf("%s\n",ReadBuffer);
}
3、问题记录
3.1、第一步便遇到了问题,无法安装0120的DFP,其他的均可以

后面重新安装了版本高一点的keil,,且不能安装在中文目录下,再次安装pack包才可以。
3.2、新建工程一直卡在.s文件,原因是没有勾选 micro_lib


3.3、编译总是容易出错
keil经常会因为一个其他头文件错误,包含进来之后无法准确定位哪里错误导致找错误找半天
3.4、rtc时钟时死机
原因应该是未处理中断,而中断开启了,这里给关闭
