main.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. */
  9. #include <rtthread.h>
  10. #include <rtdevice.h>
  11. #include "board.h"
  12. #define LED_PIN GET_PIN(C,6)
  13. int main(void)
  14. {
  15. int count = 1;
  16. rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);
  17. while (count++)
  18. {
  19. rt_pin_write(LED_PIN, PIN_HIGH);
  20. rt_thread_mdelay(500);
  21. rt_pin_write(LED_PIN, PIN_LOW);
  22. rt_thread_mdelay(500);
  23. }
  24. return RT_EOK;
  25. }
  26. #ifdef BSP_USING_GPIO
  27. #define KEY1_PIN GET_PIN(C,5)
  28. void key1_cb(void *args)
  29. {
  30. rt_kprintf("key1 irq!\n");
  31. }
  32. static int pin_sample(int argc, char *argv[])
  33. {
  34. rt_pin_mode(KEY1_PIN, PIN_IRQ_MODE_FALLING);
  35. rt_pin_attach_irq(KEY1_PIN, PIN_IRQ_MODE_FALLING, key1_cb, RT_NULL);
  36. rt_pin_irq_enable(KEY1_PIN, PIN_IRQ_ENABLE);
  37. return RT_EOK;
  38. }
  39. MSH_CMD_EXPORT(pin_sample, pin sample);
  40. #endif
  41. #ifdef BSP_USING_ADC
  42. #define ADC_DEV_NAME "adc1"
  43. #define ADC_DEV_CHANNEL 0
  44. #define REFER_VOLTAGE 330
  45. #define CONVERT_BITS (1 << 12)
  46. static int adc_vol_sample(int argc, char *argv[])
  47. {
  48. rt_adc_device_t adc_dev;
  49. rt_uint32_t value, vol;
  50. rt_err_t ret = RT_EOK;
  51. adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
  52. if (adc_dev == RT_NULL)
  53. {
  54. rt_kprintf("adc sample run failed! can't find %s device!\n", ADC_DEV_NAME);
  55. return -RT_ERROR;
  56. }
  57. ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);
  58. value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);
  59. rt_kprintf("the value is :%d,", value);
  60. vol = value * REFER_VOLTAGE / CONVERT_BITS;
  61. rt_kprintf("the voltage is :%d.%02d \n", vol / 100, vol % 100);
  62. ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);
  63. return ret;
  64. }
  65. MSH_CMD_EXPORT(adc_vol_sample, adc voltage convert sample);
  66. #endif
  67. #ifdef BSP_USING_TIM
  68. #define HWTIMER_DEV_NAME "timer0"
  69. static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size)
  70. {
  71. rt_kprintf("this is hwtimer timeout callback fucntion!\n");
  72. rt_kprintf("tick is :%d !\n", rt_tick_get());
  73. return 0;
  74. }
  75. static int hwtimer_sample(int argc, char *argv[])
  76. {
  77. rt_err_t ret = RT_EOK;
  78. rt_hwtimerval_t timeout_s;
  79. rt_device_t hw_dev = RT_NULL;
  80. rt_hwtimer_mode_t mode;
  81. hw_dev = rt_device_find(HWTIMER_DEV_NAME);
  82. if (hw_dev == RT_NULL)
  83. {
  84. rt_kprintf("hwtimer sample run failed! can't find %s device!\n", HWTIMER_DEV_NAME);
  85. return -RT_ERROR;
  86. }
  87. ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR);
  88. if (ret != RT_EOK)
  89. {
  90. rt_kprintf("open %s device failed!\n", HWTIMER_DEV_NAME);
  91. return ret;
  92. }
  93. rt_device_set_rx_indicate(hw_dev, timeout_cb);
  94. mode = HWTIMER_MODE_PERIOD;
  95. //mode = HWTIMER_MODE_ONESHOT;
  96. ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode);
  97. if (ret != RT_EOK)
  98. {
  99. rt_kprintf("set mode failed! ret is :%d\n", ret);
  100. return ret;
  101. }
  102. timeout_s.sec = 2;
  103. timeout_s.usec = 0;
  104. if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s))
  105. {
  106. rt_kprintf("set timeout value failed\n");
  107. return -RT_ERROR;
  108. }
  109. rt_thread_mdelay(3500);
  110. rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s));
  111. rt_kprintf("Read: Sec = %d, Usec = %d\n", timeout_s.sec, timeout_s.usec);
  112. return ret;
  113. }
  114. MSH_CMD_EXPORT(hwtimer_sample, hwtimer sample);
  115. #endif
  116. #ifdef BSP_USING_PWM
  117. #define PWM_DEV_NAME "pwm0" /* PWM设备名称 */
  118. #define PWM_DEV_CHANNEL 0 /* PWM通道 */
  119. struct rt_device_pwm *pwm_dev; /* PWM设备句柄 */
  120. static int pwm_sample(int argc, char *argv[])
  121. {
  122. rt_uint32_t period, pulse;
  123. period = 500000; /* 周期为0.5ms,单位为纳秒ns */
  124. pulse = 250000; /* PWM脉冲宽度值,单位为纳秒ns */
  125. pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
  126. if (pwm_dev == RT_NULL)
  127. {
  128. rt_kprintf("pwm sample run failed! can't find %s device!\n", PWM_DEV_NAME);
  129. return -RT_ERROR;
  130. }
  131. rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
  132. rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
  133. return RT_EOK;
  134. }
  135. MSH_CMD_EXPORT(pwm_sample, pwm sample);
  136. #endif
  137. #ifdef BSP_USING_RTC
  138. #include <sys/time.h>
  139. static int rtc_sample(int argc, char *argv[])
  140. {
  141. rt_err_t ret = RT_EOK;
  142. time_t now;
  143. ret = set_date(2020, 2, 28);
  144. if (ret != RT_EOK)
  145. {
  146. rt_kprintf("set RTC date failed\n");
  147. return ret;
  148. }
  149. ret = set_time(23, 59, 55);
  150. if (ret != RT_EOK)
  151. {
  152. rt_kprintf("set RTC time failed\n");
  153. return ret;
  154. }
  155. //rt_thread_mdelay(3000);
  156. now = time(RT_NULL);
  157. rt_kprintf("%s\n", ctime(&now));
  158. return ret;
  159. }
  160. MSH_CMD_EXPORT(rtc_sample, rtc sample);
  161. #endif
  162. #ifdef BSP_USING_WDT
  163. #define WDT_DEVICE_NAME "wdt"
  164. static rt_device_t wdg_dev;
  165. static void idle_hook(void)
  166. {
  167. rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, RT_NULL);
  168. rt_kprintf("feed the dog!\n ");
  169. }
  170. static int wdt_sample(int argc, char *argv[])
  171. {
  172. rt_err_t ret = RT_EOK;
  173. rt_uint32_t timeout = 2;
  174. char device_name[RT_NAME_MAX];
  175. if (argc == 2)
  176. {
  177. rt_strncpy(device_name, argv[1], RT_NAME_MAX);
  178. }
  179. else
  180. {
  181. rt_strncpy(device_name, WDT_DEVICE_NAME, RT_NAME_MAX);
  182. }
  183. wdg_dev = rt_device_find(device_name);
  184. if (!wdg_dev)
  185. {
  186. rt_kprintf("find %s failed!\n", device_name);
  187. return -RT_ERROR;
  188. }
  189. ret = rt_device_init(wdg_dev);
  190. if (ret != RT_EOK)
  191. {
  192. rt_kprintf("initialize %s failed!\n", device_name);
  193. return -RT_ERROR;
  194. }
  195. ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);
  196. if (ret != RT_EOK)
  197. {
  198. rt_kprintf("set %s timeout failed!\n", device_name);
  199. return -RT_ERROR;
  200. }
  201. ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL);
  202. if (ret != RT_EOK)
  203. {
  204. rt_kprintf("start %s failed!\n", device_name);
  205. return -RT_ERROR;
  206. }
  207. rt_thread_idle_sethook(idle_hook);
  208. return ret;
  209. }
  210. MSH_CMD_EXPORT(wdt_sample, wdt sample);
  211. #endif
  212. #ifdef BSP_USING_SPI
  213. #define W25Q_SPI_DEVICE_NAME "spi00"
  214. #define W25Q_FLASH_NAME "norflash0"
  215. #include "drv_spi.h"
  216. #ifdef RT_USING_SFUD
  217. #include "spi_flash_sfud.h"
  218. static int rt_hw_spi_flash_init(void)
  219. {
  220. rt_hw_spi_device_attach("spi0", W25Q_SPI_DEVICE_NAME, GPIOP, PIN22);
  221. if (RT_NULL == rt_sfud_flash_probe(W25Q_FLASH_NAME, W25Q_SPI_DEVICE_NAME))
  222. {
  223. return -RT_ERROR;
  224. };
  225. return RT_EOK;
  226. }
  227. INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);
  228. static void spi_w25q_sample(int argc, char *argv[])
  229. {
  230. struct rt_spi_device *spi_dev_w25q;
  231. char name[RT_NAME_MAX];
  232. rt_uint8_t w25x_read_id = 0x90;
  233. rt_uint8_t id[5] = {0};
  234. if (argc == 2)
  235. {
  236. rt_strncpy(name, argv[1], RT_NAME_MAX);
  237. }
  238. else
  239. {
  240. rt_strncpy(name, W25Q_SPI_DEVICE_NAME, RT_NAME_MAX);
  241. }
  242. /* 查找 spi 设备获取设备句柄 */
  243. spi_dev_w25q = (struct rt_spi_device *)rt_device_find(name);
  244. struct rt_spi_configuration cfg;
  245. cfg.data_width = 8;
  246. cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB;
  247. cfg.max_hz = 30 * 1000 * 1000; /* 20M */
  248. rt_spi_configure(spi_dev_w25q, &cfg);
  249. if (!spi_dev_w25q)
  250. {
  251. rt_kprintf("spi sample run failed! can't find %s device!\n", name);
  252. }
  253. else
  254. {
  255. /* 方式1:使用 rt_spi_send_then_recv()发送命令读取ID */
  256. rt_spi_send_then_recv(spi_dev_w25q, &w25x_read_id, 1, id, 5);
  257. rt_kprintf("use rt_spi_send_then_recv() read w25q ID is:%x%x\n", id[3], id[4]);
  258. /* 方式2:使用 rt_spi_transfer_message()发送命令读取ID */
  259. struct rt_spi_message msg1, msg2;
  260. msg1.send_buf = &w25x_read_id;
  261. msg1.recv_buf = RT_NULL;
  262. msg1.length = 1;
  263. msg1.cs_take = 1;
  264. msg1.cs_release = 0;
  265. msg1.next = &msg2;
  266. msg2.send_buf = RT_NULL;
  267. msg2.recv_buf = id;
  268. msg2.length = 5;
  269. msg2.cs_take = 0;
  270. msg2.cs_release = 1;
  271. msg2.next = RT_NULL;
  272. rt_spi_transfer_message(spi_dev_w25q, &msg1);
  273. rt_kprintf("use rt_spi_transfer_message() read w25q ID is:%x%x\n", id[3], id[4]);
  274. }
  275. }
  276. MSH_CMD_EXPORT(spi_w25q_sample, spi w25q sample);
  277. #ifdef RT_USING_DFS_ELMFAT
  278. #include <dfs_file.h>
  279. #include <unistd.h>
  280. static void spi_flash_elmfat_sample(void)
  281. {
  282. int fd, size;
  283. struct statfs elm_stat;
  284. char str[] = "elmfat mount to W25Q flash.\r\n", buf[80];
  285. if (dfs_mkfs("elm", W25Q_FLASH_NAME) == 0)
  286. rt_kprintf("make elmfat filesystem success.\n");
  287. if (dfs_mount(W25Q_FLASH_NAME, "/", "elm", 0, 0) == 0)
  288. rt_kprintf("elmfat filesystem mount success.\n");
  289. if (statfs("/", &elm_stat) == 0)
  290. rt_kprintf("elmfat filesystem block size: %d, total blocks: %d, free blocks: %d.\n",
  291. elm_stat.f_bsize, elm_stat.f_blocks, elm_stat.f_bfree);
  292. if (mkdir("/user", 0x777) == 0)
  293. rt_kprintf("make a directory: '/user'.\n");
  294. rt_kprintf("Write string '%s' to /user/test.txt.\n", str);
  295. fd = open("/user/test.txt", O_WRONLY | O_CREAT);
  296. if (fd >= 0)
  297. {
  298. if (write(fd, str, sizeof(str)) == sizeof(str))
  299. rt_kprintf("Write data done.\n");
  300. close(fd);
  301. }
  302. fd = open("/user/test.txt", O_RDONLY);
  303. if (fd >= 0)
  304. {
  305. size = read(fd, buf, sizeof(buf));
  306. close(fd);
  307. if (size == sizeof(str))
  308. rt_kprintf("Read data from file test.txt(size: %d): %s \n", size, buf);
  309. }
  310. }
  311. MSH_CMD_EXPORT(spi_flash_elmfat_sample, spi flash elmfat sample);
  312. #endif
  313. #endif
  314. #endif
  315. #ifdef BSP_USING_SPI
  316. #ifdef RT_USING_SPI_MSD
  317. #define SD_SPI_DEVICE_NAME "spi10"
  318. #define SDCARD_NAME "sd0"
  319. #include "drv_spi.h"
  320. #include "spi_msd.h"
  321. #include <dfs_file.h>
  322. #include <unistd.h>
  323. static int rt_hw_spi1_tfcard(void)
  324. {
  325. rt_hw_spi_device_attach("spi1", SD_SPI_DEVICE_NAME, GPIOB, PIN6);
  326. return msd_init(SDCARD_NAME, SD_SPI_DEVICE_NAME);
  327. }
  328. INIT_DEVICE_EXPORT(rt_hw_spi1_tfcard);
  329. static void elmfat_sample(void)
  330. {
  331. int fd, size;
  332. struct statfs elm_stat;
  333. char str[] = "elmfat mount to sdcard.", buf[80];
  334. if (dfs_mkfs("elm", SDCARD_NAME) == 0)
  335. rt_kprintf("make elmfat filesystem success.\n");
  336. if (dfs_mount(SDCARD_NAME, "/", "elm", 0, 0) == 0)
  337. rt_kprintf("elmfat filesystem mount success.\n");
  338. if (statfs("/", &elm_stat) == 0)
  339. rt_kprintf("elmfat filesystem block size: %d, total blocks: %d, free blocks: %d.\n",
  340. elm_stat.f_bsize, elm_stat.f_blocks, elm_stat.f_bfree);
  341. if (mkdir("/user", 0x777) == 0)
  342. rt_kprintf("make a directory: '/user'.\n");
  343. rt_kprintf("Write string '%s' to /user/test.txt.\n", str);
  344. fd = open("/user/test.txt", O_WRONLY | O_CREAT);
  345. if (fd >= 0)
  346. {
  347. if (write(fd, str, sizeof(str)) == sizeof(str))
  348. rt_kprintf("Write data done.\n");
  349. close(fd);
  350. }
  351. fd = open("/user/test.txt", O_RDONLY);
  352. if (fd >= 0)
  353. {
  354. size = read(fd, buf, sizeof(buf));
  355. close(fd);
  356. if (size == sizeof(str))
  357. rt_kprintf("Read data from file test.txt(size: %d): %s \n", size, buf);
  358. }
  359. }
  360. MSH_CMD_EXPORT(elmfat_sample, elmfat sample);
  361. #endif
  362. #endif
  363. #ifdef BSP_USING_SDIO
  364. #define SDCARD_NAME "sd0"
  365. #include <dfs_file.h>
  366. #include <unistd.h>
  367. static void sdio_elmfat_sample(void)
  368. {
  369. int fd, size;
  370. struct statfs elm_stat;
  371. char str[] = "elmfat mount to sdcard.\n", buf[80];
  372. if (dfs_mkfs("elm", SDCARD_NAME) == 0)
  373. rt_kprintf("make elmfat filesystem success.\n");
  374. if (dfs_mount(SDCARD_NAME, "/", "elm", 0, 0) == 0)
  375. rt_kprintf("elmfat filesystem mount success.\n");
  376. if (statfs("/", &elm_stat) == 0)
  377. rt_kprintf("elmfat filesystem block size: %d, total blocks: %d, free blocks: %d.\n",
  378. elm_stat.f_bsize, elm_stat.f_blocks, elm_stat.f_bfree);
  379. if (mkdir("/user", 0x777) == 0)
  380. rt_kprintf("make a directory: '/user'.\n");
  381. rt_kprintf("Write string '%s' to /user/test.txt.\n", str);
  382. fd = open("/user/test.txt", O_WRONLY | O_CREAT);
  383. if (fd >= 0)
  384. {
  385. if (write(fd, str, sizeof(str)) == sizeof(str))
  386. rt_kprintf("Write data done.\n");
  387. close(fd);
  388. }
  389. fd = open("/user/test.txt", O_RDONLY);
  390. if (fd >= 0)
  391. {
  392. size = read(fd, buf, sizeof(buf));
  393. close(fd);
  394. if (size == sizeof(str))
  395. rt_kprintf("Read data from file test.txt(size: %d): %s \n", size, buf);
  396. }
  397. }
  398. MSH_CMD_EXPORT(sdio_elmfat_sample, sdio elmfat sample);
  399. #endif
  400. #ifdef RT_USING_HWCRYPTO
  401. static void crypto_sample(void)
  402. {
  403. rt_uint8_t temp[] = {0, 1, 2, 3, 4, 5, 6, 7};
  404. struct rt_hwcrypto_ctx *ctx;
  405. rt_uint32_t result = 0;
  406. struct hwcrypto_crc_cfg cfg =
  407. {
  408. .last_val = 0x0,
  409. .poly = 0x04C11DB7,
  410. .width = 8,
  411. .xorout = 0x00000000,
  412. .flags = 0,
  413. };
  414. ctx = rt_hwcrypto_crc_create(rt_hwcrypto_dev_default(), HWCRYPTO_CRC_CRC32);
  415. rt_hwcrypto_crc_cfg(ctx, &cfg);
  416. result = rt_hwcrypto_crc_update(ctx, temp, sizeof(temp));
  417. rt_kprintf("result: 0x%08x \n", result);
  418. rt_hwcrypto_crc_destroy(ctx);
  419. }
  420. MSH_CMD_EXPORT(crypto_sample, crypto sample);
  421. #endif
  422. #ifdef BSP_USING_NOR_FLASH
  423. #define NORFLASH_DEV_NAME "nor"
  424. static int norflash_sample(int argc, char *argv[])
  425. {
  426. rt_err_t ret = RT_EOK;
  427. rt_device_t hw_dev = RT_NULL;
  428. hw_dev = rt_device_find(NORFLASH_DEV_NAME);
  429. if (hw_dev == RT_NULL)
  430. {
  431. rt_kprintf("norflash sample run failed! can't find %s device!\n", NORFLASH_DEV_NAME);
  432. return -RT_ERROR;
  433. }
  434. else
  435. {
  436. rt_kprintf("norflash sample run success! find %s device!\n", NORFLASH_DEV_NAME);
  437. }
  438. ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR);
  439. if (ret != RT_EOK)
  440. {
  441. rt_kprintf("open %s device failed!\n", NORFLASH_DEV_NAME);
  442. return ret;
  443. }
  444. else
  445. {
  446. rt_kprintf("open %s device success!\n", NORFLASH_DEV_NAME);
  447. }
  448. struct rt_mtd_nor_device *hw_nor;
  449. hw_nor = RT_MTD_NOR_DEVICE(hw_dev);
  450. long id = hw_nor->ops->read_id(hw_nor);
  451. rt_kprintf("id = %08x!\n", id);
  452. // rt_device_set_rx_indicate(hw_dev, timeout_cb);
  453. // mode = HWTIMER_MODE_PERIOD;
  454. // //mode = HWTIMER_MODE_ONESHOT;
  455. // ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode);
  456. // if (ret != RT_EOK)
  457. // {
  458. // rt_kprintf("set mode failed! ret is :%d\n", ret);
  459. // return ret;
  460. // }
  461. // timeout_s.sec = 2;
  462. // timeout_s.usec = 0;
  463. // if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s))
  464. // {
  465. // rt_kprintf("set timeout value failed\n");
  466. // return -RT_ERROR;
  467. // }
  468. // rt_thread_mdelay(3500);
  469. // rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s));
  470. // rt_kprintf("Read: Sec = %d, Usec = %d\n", timeout_s.sec, timeout_s.usec);
  471. return ret;
  472. }
  473. MSH_CMD_EXPORT(norflash_sample, norflash sample);
  474. #endif