`
本帖最后由 jf_30632307 于 2020-11-18 00:26 编辑
之前发了一个版本,后来才发现用错账号了,现在用这个账号重新发一次,顺便增加一些更新
开发板有RGB,有按钮,SPI Flash,当然也有留i2c接口,但是我目前手上没有i2c设备,所以就先不加这个功能了。我们简单规划一下这个例程的功能吧:
1) 一个按钮,按下去一次就随机改变一次RGB颜色
2) 另外一个按钮,按下去一次就保存当前的RGB颜色,然后下次开机就显示保存的RGB颜色
废话不多说,赶紧敲代码,详细第二期再说,请耐心等待下期更新!
我们基于helloworld工程来修改,
1. 修改添加LED功能
首先led部分的
电路为:
所以首先我们需要控制LED的3个颜色的IO分别为PIO1,2,3控制R,B,G三种颜色
还是要参照例程,发现添加GPIO要有以下步骤:
1) helloworld.c修改
- //
- #define APP_BOARD_TEST_LED_PORT BOARD_LED_RED_GPIO_PORT
- //添加led配置输出引脚
- gpio_pin_config_t led_config = {
- kGPIO_DigitalOutput,
- 0,
- };
- // init led gpio, gpio 0,1,2,3 for led, r,g,b
- GPIO_Portinit(GPIO, APP_BOARD_TEST_LED_PORT);
- //配置P0_0,P0_1,P0_2,P0_3作为输出引脚
- GPIO_PinInit(GPIO, APP_BOARD_TEST_LED_PORT, 3U, &led_config);
- GPIO_PinInit(GPIO, APP_BOARD_TEST_LED_PORT, 0U, &led_config);
- GPIO_PinInit(GPIO, APP_BOARD_TEST_LED_PORT, 1U, &led_config);
- GPIO_PinInit(GPIO, APP_BOARD_TEST_LED_PORT, 2U, &led_config);
-
- //输出0,1,toggle
- GPIO_PortToggle(GPIO, BOARD_LED_RED_GPIO_PORT, 1u << 2U);
- GPIO_PinWrite(GPIO, BOARD_LED_RED_GPIO_PORT, 2U, 0);
- GPIO_PinWrite(GPIO, BOARD_LED_RED_GPIO_PORT, 2U, 1);
2)board.h
- #define BOARD_LED_RED_GPIO GPIO
- #define BOARD_LED_RED_GPIO_PORT 0U
- #define BOARD_LED_RED1_GPIO_PIN 0U
- #define BOARD_LED_RED2_GPIO_PIN 1U
- #define BOARD_LED_RED3_GPIO_PIN 2U
- #define BOARD_LED_RED4_GPIO_PIN 3U
3)pin_mux.c
- /* Initialize GPIO functionality on pin PIO0_3 (pin 6) */
- GPIO_PinInit(BOARD_INITPINS_LED_RED_GPIO, BOARD_INITPINS_LED_RED_PORT, 0U, &LED_RED_config);
- GPIO_PinInit(BOARD_INITPINS_LED_RED_GPIO, BOARD_INITPINS_LED_RED_PORT, 1U, &LED_RED_config);
- GPIO_PinInit(BOARD_INITPINS_LED_RED_GPIO, BOARD_INITPINS_LED_RED_PORT, 2U, &LED_RED_config);
- GPIO_PinInit(BOARD_INITPINS_LED_RED_GPIO,BOARD_INITPINS_LED_RED_PORT,3U, &LED_RED_config);
2. 添加按键中断触发功能
参考样例工程:jn5189dk6_pint_pin_interrupt
1) 把driver层的fsl_pint.h和fsl_pint.c拷贝到hello工程的driver文件夹
2) helloworld.c添加:
- #include "fsl_pint.h"
- #include
- int8_t color[3]={1,0,0}; //保存颜色值
- /*!
- * 按键中断回调函数
- */
- void pint_intr_callback(pint_pin_int_t pintr, uint32_t pmatch_status)
- {
- PRINTF("f
- PINT Pin Interrupt %d event detected.", pintr);
- color[0]=rand()%2;
- color[1]=rand()%2;
- color[2]=rand()%2;//生成随机颜色
- GPIO_PinWrite(GPIO, BOARD_LED_RED_GPIO_PORT, 1U, color[0]);
- GPIO_PinWrite(GPIO, BOARD_LED_RED_GPIO_PORT, 2U, color[1]);
- GPIO_PinWrite(GPIO, BOARD_LED_RED_GPIO_PORT, 3U, color[2]);//改变颜色
- }
- Int main(void){
- ……
- /* Connect trigger sources to PINT初始化按键中断接口 */
- INPUTMUX_Init(INPUTMUX);
- INPUTMUX_AttachSignal(INPUTMUX,0U,kINPUTMUX_GpioPort0Pin4ToPintsel);
- PINT_Init(PINT);
- /* Setup Pin Interrupt 0 for rising edge 配置上升沿中断回调 */
- PINT_PinInterruptConfig(PINT, 0U, kPINT_PinIntEnableRiseEdge, pint_intr_callback);
- /* Enable callbacks for PINT0 by Index */
- PINT_EnableCallbackByIndex(PINT, 0U);
添加了以上代码就可以随机产生不同的灯亮的组合,这样按键之后就可以改变颜色了。
3. 添加保存数据到flash功能
1) 添加flash工程里面的driver层:fsl_flash.c和fsl_flash.h
2)helloworld.c添加
- #define FLASH_BUFF_SIZE 4
- #define FLASH_START_ADDRESS 0x10000 //定义保存flash的地址
- #define FLASH_START_PAGE (FLASH_START_ADDRESS / FLASH_PAGE_SIZE) //获取地址的页数
- 。。。
- uint32_t readData[FLASH_BUFF_SIZE] = {0};//init,r,g,b,color读取flash的颜色值
- uint32_t olddata[FLASH_BUFF_SIZE]={0};//用来对比旧数据,如果不一样就保存数据到flash
- 。。。
- //保存数据到flash
- static void saveData(void){
- FLASH_ErasePages(FLASH, FLASH_START_PAGE, 1); //保存之前一定要先擦除,不然保存不了
- uint32_t *pu32Start = (uint32_t *)(FLASH_START_ADDRESS);
- uint32_t temp[4];
- FLASH_Program(FLASH, pu32Start, readData, FLASH_BUFF_SIZE * sizeof(uint32_t));//保存到flash的API
- PRINTF("save data 0=%d,1=%d,2=%d,3=%d
- ",readData[0],readData[1],readData[2],readData[3]);//打印颜色值
- }
这里的flash保存数据要注意的就是保存之前记得清空flash,不然是保存不了的。
4. 最终实现
每次按键都随机改变颜色,如果颜色改变了,就保存下来,下次开机的时候自动显示该颜色。
`