main.c 15 KB

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