TA的每日心情 | 奋斗 2023-12-3 18:51 |
---|
签到天数: 772 天 连续签到: 1 天 [LV.10]以坛为家III
|
真的很高兴发这贴,不是因为今天是年三十了,也不是因为今天天气晴朗。而是我发现了一个重大问题。
1,烦得很
先说说我昨天干的事情吧。昨天我用的是MDK改了一个主程序,我的意思是由于RGB坏了,我还没有法买,快递哥哥都回家了。
我就想再加一个灯,装灯,嘿嘿
我看了下论坛里的贴子,也没看原理图我决定用A1,也就是PORTA的第一脚开刀。
是这样,
在hal_rgb.h中定义A1,由于大家现在看网络直播都爱用666我就用666起了个函数名。
- #define LED2_ON() GPIO_ResetBits(GPIOB,GPIO_Pin_5)
- #define LED2_OFF() GPIO_SetBits(GPIOB,GPIO_Pin_5)
- #define LED1_ON() GPIO_ResetBits(GPIOB,GPIO_Pin_6)
- #define LED1_OFF() GPIO_SetBits(GPIOB,GPIO_Pin_6)
- #define LED666_ON() GPIO_ResetBits(GPIOA,GPIO_Pin_1)
- #define LED666_OFF() GPIO_SetBits(GPIOA,GPIO_Pin_1)
- #define LED_G_ON() GPIO_ResetBits(GPIOB,GPIO_Pin_7)
- #define LED_G_OFF() GPIO_SetBits(GPIOB,GPIO_Pin_7)
- #define LED_R_ON() GPIO_ResetBits(GPIOB,GPIO_Pin_8)
- #define LED_R_OFF() GPIO_SetBits(GPIOB,GPIO_Pin_8)
- #define LED_B_ON() GPIO_ResetBits(GPIOB,GPIO_Pin_9)
- #define LED_B_OFF() GPIO_SetBits(GPIOB,GPIO_Pin_9)
复制代码 然后在Hal_RBG.c中初始化:- /*****************************************************************************
- º¯ÊýÃû³Æ : RGB_LED_Init
- ¹¦ÄÜÃèÊö : RGB_LED³õʼ»¯
- ÊäÈë²ÎÊý : ÎÞ
- ·µ»Ø²ÎÊý : ÎÞ
- ʹÓÃ˵Ã÷ : ÎÞ
- *****************************************************************************/
- void RGB_LED_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA ,ENABLE);
-
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_5 | GPIO_Pin_6;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStruct);
-
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStruct);
-
- LED1_OFF();
- LED2_OFF();
- LED666_OFF();
- LED_R_OFF(); //R
- LED_G_OFF(); //G
- LED_B_OFF(); //B
- }
复制代码 再在protocol.c中加上这个函数:
- static unsigned char dp_download_led_switch_handle(const unsigned char value[], unsigned short length)
- {
- //ʾÀý:µ±Ç°DPÀàÐÍΪBOOL
- unsigned char ret;
- //0:¹Ø/1:¿ª
- unsigned char led_switch;
- uint8_t colour_r,colour_g,colour_b;
-
- led_switch = mcu_get_dp_download_bool(value,length);
- if(led_switch == 0)
- {
- //¿ª¹Ø¹Ø
- LED_RGB_Control(0,0,0);
- LED666_OFF();
- }
- else
- {
- //¿ª¹Ø¿ª
- LED666_ON();
- switch(FlashBuffer.work_mode)
- {
- case 0:
- LED_RGB_Control(FlashBuffer.bright_value,FlashBuffer.bright_value,FlashBuffer.bright_value);
- break;
-
- case 1:
- colour_r = hex_to_bcd(FlashBuffer.colour[0],FlashBuffer.colour[1]);
- colour_g = hex_to_bcd(FlashBuffer.colour[2],FlashBuffer.colour[3]);
- colour_b = hex_to_bcd(FlashBuffer.colour[4],FlashBuffer.colour[5]);
- LED_RGB_Control(colour_r,colour_g,colour_b);
- break;
-
- case 2:
- colour_r = hex_to_bcd(FlashBuffer.scene[0],FlashBuffer.scene[1]);
- colour_g = hex_to_bcd(FlashBuffer.scene[2],FlashBuffer.scene[3]);
- colour_b = hex_to_bcd(FlashBuffer.scene[4],FlashBuffer.scene[5]);
- LED_RGB_Control(colour_r,colour_g,colour_b);
- break;
- }
- }
-
- Earse_Flash(PARA_ADDR);
- FlashBuffer.led_switch = led_switch;
-
- if(Write_Flash(PARA_ADDR,(unsigned char *)&FlashBuffer,sizeof(FlashBuffer)) == ERROR)
- {
- return ERROR;
- }
-
- ret = mcu_dp_bool_update(DPID_LED_SWITCH,led_switch);
- if(ret == SUCCESS)
- return SUCCESS;
- else
- return ERROR;
- }
复制代码 然后编译,有58个警告,那个boot也有几个,我看了无关大局,所以也没改,先让它滚蛋。
然后我按网友JLINK合并的方法合并这两个文件,用ST官方的串口软件Flash loader demonstrator下载到涂鸦板子里,LED1不亮。我怀疑是我合并错了,我下了winhex合并,下了后也不行,又下了别了U什么完意,反正也不行。
我没则了,我就上微信求大神帮忙,可是大神就应该亮灯的。我也觉得应亮灯的,我于是重新把DEMO解压,不做任何修改编译。合成完后也不行。就这样,昨天在不太高兴的心情中渡过了。
2,转机
今天早晨起来,我想了一下,觉得合并没有多大问题。只是我用的是MDK,那么试下IAR吧。反正DEMO里也有,我就用IAR编译
后,用JLINK合并,下载。泥马LED1终于亮了。我得出重大结论,大家以后用MDK出不来的用IAR编译吧
3,实施
那么问题找到了,我就用IAR把上边步骤给写了一下,下边我想重点说说合并,我也是用JLINK合并文件的:
首先,最好把CPU选择AUTO,应为怕FLASH不够用。打开Boot那个BIN
然后选File的Merge data file......
打开编译后的主文件BIN
然后JLINK有个弹出窗口,添2000
提示你是否把原来覆盖:
然后另存为BIN文件,BIN在右下选择
起个自己的名字:我用的是EWARM3.BIN
我用串口软件下载:
下载后,我按了下MCU这边的复位,过了半分钟,LED1亮了,因为我以前联过网所以这次就直接上网了。反正LED1始终亮着。
那么效果如何呢:
以下是开LED666和并LED666的效果,由于本人很懒就中用LED了,用万用表量一下:
我发现LED的开关正好同APP相反
|
|