NRF52840学习历程(十)PWM02_4通道独立控制之向上呼吸灯

本文记录了2021年2月5日作者在家利用NRF52840EVALKIT开发板进行学习的情况,包括开发板型号、JLINK下载工具的选择、版本信息以及IO接口的使用。内容涵盖了OLED显示屏、按键、LED、串口、ADC等硬件连接,并提供了部分代码示例,涉及PWM中断的实现。同时还分享了资源链接供进一步学习。
摘要由CSDN通过智能技术生成

时间在2021年2月5日,寒假放假在家好好学一学nRF52840

 

今天还在感冒,休息一波

 

开发板:初雪的100出头那块 NRF52840 EVAL KIT

下载工具:JINLK V11(最好是JLINK V9以上 也有人用JLINK OB也行,其他的下载器诸如STLINK,DAP不建议用)

版本号: KEIL5编程环境,CMSIS为5.3.0, NRF52840的CMSIS为8.35.0

参考资料: NRF52840-Eval-Kit-Schematic.pdf(原理图)

nRF5_SDK_17.0.2_d674dde(官方例程)

nRF5_SDK_17.0.0_offline_doc(官方文档)

nRF52840_PS_v1.1.pdf(官方数据手册)

 

已用IO

0.96OLED / 1.29彩色OLED

D0(CLK) -> 12

D1(SDA) -> 23

RES     -> 7

DC      -> 21

CS      -> 19

 

按键

KEY0 ->11

KEY1 ->24

KEY2 ->20

KEY3->17

 

LED

LED0 ->13

LED1->14

LED2->32+9=41

LED3->16

 

串口

TX ->6

RX ->8

 

ADC

光敏 -> 5

摇杆X -> 28

摇杆Y -> 29

 

IIC_0.96OLED

SDA -> 32

SCL -> 22

 

还没用到(空闲)

P0.0 1 2 3 9 10 15 25 26 27 30 31

P1.1 2 3 4 5 6 7 8 10 11 12 13 14 15

 

 

这个放在全局变量上面

uint16_t My_PWM0_top_value = 10000; // 1/1M  * 10000 =10ms

中断添加代码如下即可

void MY_PWM_Interrupt(nrfx_pwm_evt_type_t event_type)
{
	if (event_type == NRF_DRV_PWM_EVT_FINISHED)//顺序播放完了。
	{
		static uint16_t breath_pwm = 33;
		
		if(my_pwm_sequ_val.channel_0 > breath_pwm) // 向上的呼吸灯
			my_pwm_sequ_val.channel_0 -=breath_pwm;
		else 
			my_pwm_sequ_val.channel_0 = My_PWM0_top_value;
		
		if(my_pwm_sequ_val.channel_1 > breath_pwm) // 向上的呼吸灯
			my_pwm_sequ_val.channel_1 -=breath_pwm;
		else 
			my_pwm_sequ_val.channel_1 = My_PWM0_top_value;

		if(my_pwm_sequ_val.channel_2 > breath_pwm) // 向上的呼吸灯
			my_pwm_sequ_val.channel_2 -=breath_pwm;
		else 
			my_pwm_sequ_val.channel_2 = My_PWM0_top_value;

		if(my_pwm_sequ_val.channel_3 > breath_pwm) // 向上的呼吸灯
			my_pwm_sequ_val.channel_3 -=breath_pwm;
		else 
			my_pwm_sequ_val.channel_3 = My_PWM0_top_value;		
		
	}
}

 

 

 

链接:https://pan.baidu.com/s/18NfzSXwSLHxpGeAAIPxVMA

提取码:efwv

复制这段内容后打开百度网盘手机App,操作更方便哦

以下是nrf52840按键控制流水灯的代码实现: ```c #include <zephyr.h> #include <device.h> #include <devicetree.h> #include <drivers/gpio.h> #define LED0_NODE DT_ALIAS(led0) #define LED0 DT_GPIO_LABEL(LED0_NODE, gpios) #define PIN0 DT_GPIO_PIN(LED0_NODE, gpios) #define FLAGS0 DT_GPIO_FLAGS(LED0_NODE, gpios) #define LED1_NODE DT_ALIAS(led1) #define LED1 DT_GPIO_LABEL(LED1_NODE, gpios) #define PIN1 DT_GPIO_PIN(LED1_NODE, gpios) #define FLAGS1 DT_GPIO_FLAGS(LED1_NODE, gpios) #define SW0_NODE DT_ALIAS(sw0) #define SW0 DT_GPIO_LABEL(SW0_NODE, gpios) #define PIN_SW0 DT_GPIO_PIN(SW0_NODE, gpios) #define FLAGS_SW0 DT_GPIO_FLAGS(SW0_NODE, gpios) #define SLEEP_TIME_MS 100 void main(void) { const struct device *dev_led0; const struct device *dev_led1; const struct device *dev_sw0; bool led0_is_on = true; bool led1_is_on = false; bool sw0_is_pressed = false; dev_led0 = device_get_binding(LED0); dev_led1 = device_get_binding(LED1); dev_sw0 = device_get_binding(SW0); gpio_pin_configure(dev_led0, PIN0, GPIO_OUTPUT_ACTIVE | FLAGS0); gpio_pin_configure(dev_led1, PIN1, GPIO_OUTPUT_ACTIVE | FLAGS1); gpio_pin_configure(dev_sw0, PIN_SW0, GPIO_INPUT | FLAGS_SW0); while (1) { gpio_pin_set(dev_led0, PIN0, (int)led0_is_on); gpio_pin_set(dev_led1, PIN1, (int)led1_is_on); sw0_is_pressed = !gpio_pin_get(dev_sw0, PIN_SW0); if (sw0_is_pressed) { led0_is_on = !led0_is_on; led1_is_on = !led1_is_on; k_msleep(SLEEP_TIME_MS); } } } ``` 该代码使用了Zephyr RTOS,通过按下nrf52840开发板上的按键,可以控制两个LED灯的状态,从而实现流水灯的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值