本帖最后由 yin_wu_qing 于 2025-3-20 13:06 编辑
一、前言
前段时间比较忙,最近终于缓过来,而距离规定评测KW41Z开发板的时限越来越近了,今天来分享一下前段时间个人评测时遇到的一些问题与经验。承接上期的④驱动直流电机的帖子,预期是通过该功能的实现,然后将其主干函数接口移入蓝牙串口demo中,然而结合PWM0四路通道、PWM1两路通道、PWM2两路通道分布来看,有两个通道的管脚被复用成串口,还有几个复用管脚没有被引出到两边排座,因此可用来兼顾“bluetooth_wireless_uart”工程的原本功能后,再调试出两路PWM显得比较紧凑,加之调试当中发现,板子两边的排座接口绝大多数是需要自行焊接好0Ω的电阻才能正常使用,这些结合官方提供的原理图可知,如下图标识的红色框。
二、工程配置
根据上述,咱也暂时不考虑将PWM功能接口移入蓝牙串口工程,在原计划上稍作更改,先实现一个蓝牙控制台灯功能。将SDK中的“frdmkw41z_wireless_examples_bluetooth_wireless_uart_bm”工程导出至MCUXpresso IDE中,然后编译下载到开发板中运行,发现即可以通过手机端的“IoT_Toolbox”工具去发送字符,然后在PC端的串口工具上接收打印;也可以通过PC端的串口调试助手给开发板发数据,然后在手机端的App显示接收数据,这样看来,K41Z的“bluetooth_wireless_uart_bm”工程似乎是K41Z相当于一个蓝牙数据透传网络中的“中间桥梁”。因此在此基础上去控制板上的某一个管脚输出高低电平,显得尤为简单。然而万万没想到的是也没那么顺利,听我娓娓道来。
①、也不知道当初这款板是为何设计的,两边的排座是不能直接使用的,因为板上都没焊接相应的贴片电阻。于是本人使用PTC19做为将来通过蓝牙来控制的GPIO口,按照原理图连接关系,需要将SH15短接,这里使用烙铁在SH15处焊接了根导线,正如下图所示。
②、接下来配置PTC19做为GPIOC_19,并初始化。
③、在BleApp_ReceivedUartStream()串口接收函数中添加逻辑处理代码。
三、代码完善
pin_mux.c源文件中,将PTC19添加至LED初始化函数中。
- #define PIN0_IDX 0u /*!< Pin number for pin 0 in a port */
- #define PIN1_IDX 1u /*!< Pin number for pin 1 in a port */
- #define PIN18_IDX 18u /*!< Pin number for pin 18 in a port */
- #define PIN19_IDX 19u /*!< Pin number for pin 19 in a port */
-
-
-
-
- void BOARD_InitLEDs(void) {
- CLOCK_EnableClock(kCLOCK_PortA);
- CLOCK_EnableClock(kCLOCK_PortB);
- CLOCK_EnableClock(kCLOCK_PortC);
-
- PORT_SetPinMux(PORTA, PIN18_IDX, kPORT_MuxAsGpio);
- PORT_SetPinMux(PORTA, PIN19_IDX, kPORT_MuxAsGpio);
- PORT_SetPinMux(PORTB, PIN0_IDX, kPORT_MuxAsGpio);
- PORT_SetPinMux(PORTC, PIN1_IDX, kPORT_MuxAsGpio);
- PORT_SetPinMux(PORTC, PIN18_IDX, kPORT_MuxAsGpio);
- PORT_SetPinMux(PORTC, PIN19_IDX, kPORT_MuxAsGpio);
- }
LED.c源文件中,初始化函数中添加对PTC19的初始化。
- gpioOutputPinConfig_t Externdled =
- {
- .gpioPort = gpioPort_C_c,
- .gpioPin = 19,
- .outputLogic = 0,
- .slewRate = pinSlewRate_Slow_c,
- .driveStrength = pinDriveStrength_High_c
- };
-
- void LED_Init
- (
- void
- )
- {
- BOARD_InitLEDs();
- (void)GpioOutputPinInit(ledPins, gLEDsOnTargetBoardCnt_c);
- GpioSetPinOutput(&Externdled);
- #if gLedRgbEnabled_d
- LED_RgbLedInit();
- #endif
-
-
- #if gTMR_Enabled_d
- mLEDTimerID = TMR_AllocateTimer();
- #endif
-
- #if gLedRgbEnabled_d && gRgbLedDimmingEnabled_d && gTMR_Enabled_d
-
- mRGBLedTimerID = TMR_AllocateTimer();
- mRbgDimInfo.ongoing = FALSE;
- mRbgDimInfo.interval = gRgbLedDimDefaultInterval_c;
- #endif /* gLedRgbEnabled_d && gRgbLedDimmingEnabled_d && gTMR_Enabled_d */
- }
wireless_uart.c源文件中的static void BleApp_ReceivedUartStream(uint8_t *pStream, uint16_t streamLength)函数中进行逻辑处理。
- static void BleApp_ReceivedUartStream(uint8_t *pStream, uint16_t streamLength)
- {
- uint8_t *pBuffer = NULL;
-
-
- pBuffer = MEM_BufferAlloc(streamLength);
- if(pStream[0])
- {
- if(pStream[0]== 0x31)
- {
- GPIO_SetPinsOutput(GPIOC,19);
- }
- else if(pStream[0]==0x30)
- {
- GPIO_ClearPinsOutput(GPIOC,19);
- }
- }
- if (pBuffer != NULL)
- {
- Serial_AsyncWrite(gAppSerMgrIf, pStream, streamLength, Uart_TxCallBack, pBuffer);
- }
- }
为了更好的用户体验,再将断开蓝牙后、再次广播时,将PTC19输出低,添加GPIO_ClearPinsOutput(GPIOC,19);
四、工程编译调试
1、基于以上操作,故将外接的LED连接到PTC19的排针座子上,结果编译后,将程序下载到板子上运行,短按一下板上的SW4,让开发板进入广播状态,然后手机端打开蓝牙、GPS,打开蓝牙调试助手,即可搜索到名为“NXP_WU”的蓝牙设备。连接后发现有创建三个服务,可通过Unknown Service服务发送字符给开发板。结果连接在PTC19管脚处的LED灯没任何反应,反而点亮了RGB灯的第一个管脚,即点亮了红色。
这就有点费解了,而且高低电平与代码中操作PTC19管脚的逻辑刚好相反。再结合pin_mux.c源码中的管脚复用情况,电路原理图的管脚分布,跳线帽设置也是出厂时的状态,一段时间了也没研究出是何原因!
2、既然可以间接控制PTC1管脚的高低电平状态,这里笔者索性将控制台灯的管脚设置在TP24测试点上(见上面RGB灯原理图),将杜邦线焊接在该点上,如下图所示:
3、在某宝上掏了几个模块与5V日光灯,做为实现蓝牙控制台灯的硬件资源。连接的示意图如下:
所对应的实物硬件连接如下:
4、运行代码,使用”蓝牙调试助手“App给K41Z发有效字符,从而实现蓝牙远程控制台灯,效果见底下视频。
五、小结
根据实际调试结果来看,PTC19管脚的信号控制似乎与PTC1(TP24)有关联,因为代码中逻辑处理部分是对PTC19管脚进行高低电平的控制,而实际应用是对PTC1起作用,通过焊接导线短接SH15处的PTC19排针座子并没有预设电平输出。尽管这块板比较陈旧,但想必硬件上也不会有大的问题吧?不然不会搜索一番,也没搜索到遇上类似的问题、现象。不知道咱们坛友有没有遇到类似的问题,欢迎回帖讨论。
播放器加载失败: 未检测到Flash Player,请到
安装
蓝牙调试助手控制台灯