社区导航

 

搜索
查看: 2113|回复: 4

[经验分享] [GD32E231C-START] 模拟I2C和OLED

[复制链接]

1117

TA的帖子

1

TA的资源

版主

Rank: 6Rank: 6

发表于 2019-3-25 20:41 | 显示全部楼层 |阅读模式
之前玩了串口以及shell功能,这一节讲解一下i2c,一开始准备用芯片的硬件实现,但是为了驱动OLED,所以为了方便测试,不飞线,直接io模拟i2c,调换i2c的引脚,引脚是PB10为I2C _SDA,PB11为I2C_SCL。代码如下:
  1. /*includes----------------------------------------------*/
  2. #include "oled.h"
  3. #include "oledfont.h"
  4. /*definition--------------------------------------------*/


  5. /*
  6.     [url=home.php?mod=space&uid=159083]@brief[/url]          延迟1us
  7.     @param          无
  8.     @retval         无
  9. */
  10. static void delay(unsigned char num)
  11. {
  12.     uint8_t i = 10;
  13.     while (num--)
  14.     {
  15.         while (i--);
  16.     }
  17. }


  18. /*
  19.     @brief          ms延迟函数
  20.     @param          无
  21.     @retval         无
  22. */
  23. static void delay_ms(unsigned int ms)//延迟函数,MS级别
  24. {
  25.     unsigned int x, y;
  26.     for (x = ms; x > 0; x--)
  27.     {
  28.         for (y = 12000; y > 0; y--);
  29.     }
  30. }


  31. /*
  32.     @brief          初始化OLED与单片机的IO接口
  33.     @param          无
  34.     @retval         无
  35. */
  36. static void OLED_GPIO_Init(void)
  37. {
  38.     rcu_periph_clock_enable(RCU_GPIOB);

  39.     gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_11);
  40.     gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_11);
  41.    
  42.     gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_10);
  43.     gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
  44.    
  45.     OLED_SCLK_Set();    //设PB11(SCL)为高电平
  46.     OLED_SDIN_Set();    //设PB10(SDA)为高电平
  47. }


  48. /*
  49.     @brief          模拟IIC起始信号
  50.     @param          无
  51.     @retval         无
  52. */
  53. static void OLED_IIC_Start(void)
  54. {

  55.     OLED_SCLK_Set();    //时钟线置高
  56.     OLED_SDIN_Set();    //信号线置高
  57.     delay(1);   //延迟1us
  58.     OLED_SDIN_Clr();    //信号线置低
  59.     delay(1);   //延迟1us
  60.     OLED_SCLK_Clr();    //时钟线置低
  61.     delay(1);   //延迟1us
  62. }


  63. /*
  64.     @brief          模拟IIC停止信号
  65.     @param          无
  66.     @retval         无
  67. */
  68. static void OLED_IIC_Stop(void)
  69. {
  70.     OLED_SDIN_Clr();    //信号线置低
  71.     delay(1);   //延迟1us
  72.     OLED_SCLK_Set();    //时钟线置高
  73.     delay(1);   //延迟1us
  74.     OLED_SDIN_Set();    //信号线置高
  75.     delay(1);   //延迟1us
  76. }


  77. /*
  78.     @brief          模拟IIC读取从机应答信号
  79.     @param          无
  80.     @retval         无
  81. */
  82. static unsigned char IIC_Wait_Ack(void)
  83. {
  84.     unsigned char ack;

  85.     OLED_SCLK_Clr();    //时钟线置低
  86.     delay(1);   //延迟1us
  87.     OLED_SDIN_Set();    //信号线置高
  88.     delay(1);   //延迟1us
  89.     OLED_SCLK_Set();    //时钟线置高
  90.     delay(1);   //延迟1us

  91.     if (OLED_READ_SDIN())   //读取SDA的电平
  92.         ack = IIC_NO_ACK;   //如果为1,则从机没有应答
  93.     else
  94.         ack = IIC_ACK;      //如果为0,则从机应答

  95.     OLED_SCLK_Clr();//时钟线置低
  96.     delay(1);   //延迟1us

  97.     return ack; //返回读取到的应答信息
  98. }


  99. /*
  100.     @brief          模拟IIC主机发送应答信号
  101.     @param          无
  102.     @retval         无
  103. */
  104. // static void IIC_Send_Ack(unsigned char ack)
  105. // {
  106. //  OLED_SCLK_Clr();    //时钟线置低
  107. //  delay(1);   //延迟1us

  108. //  if(ack == IIC_ACK)  //根据情况发送应答/不应答
  109. //      OLED_SDIN_Clr();    //应答
  110. //  else
  111. //      OLED_SDIN_Set();    //不应答
  112. //  delay(1);   //延迟1us

  113. //  OLED_SCLK_Set();    //时钟线置高,发送应答/不应答信号
  114. //  delay(1);   //延迟1us
  115. //  OLED_SCLK_Clr();    //时钟线置低
  116. //  delay(1);   //延迟1us
  117. // }


  118. /*
  119.     @brief          IIC写入一个字节
  120.     @param          IIC_Byte:写入的字节
  121.     @retval         无
  122. */
  123. static void Write_IIC_Byte(unsigned char IIC_Byte)
  124. {
  125.     unsigned char i;  //定义变量
  126.     for (i = 0; i < 8; i++) //for循环8次
  127.     {
  128.         OLED_SCLK_Clr();    //时钟线置低,为传输数据做准备
  129.         delay(1);   //延迟1us

  130.         if (IIC_Byte & 0x80) //读取最高位
  131.             OLED_SDIN_Set();//最高位为1
  132.         else
  133.             OLED_SDIN_Clr();    //最高位为0

  134.         IIC_Byte <<= 1;  //数据左移1位
  135.         delay(1);   //延迟1us
  136.         OLED_SCLK_Set(); //时钟线置高,产生上升沿,把数据发送出去
  137.         delay(1);   //延迟1us
  138.     }
  139.     OLED_SCLK_Clr();    //时钟线置低
  140.     delay(1);   //延迟1us

  141.     while (IIC_Wait_Ack()); //从机应答
  142. }



  143. /*
  144.     @brief          IIC写读取一个字节
  145.     @param          ack:应答/不应答
  146.     @retval         无
  147. */
  148. // static unsigned char Read_IIC_Byte(unsigned char ack)
  149. // {
  150. //  unsigned char data = 0;  //定义变量
  151. //  unsigned char i;  //定义变量

  152. //  OLED_SCLK_Clr();    //时钟线置低,为传输数据做准备
  153. //  delay(1);   //延迟1us

  154. //  OLED_SDIN_Set();

  155. //  for(i=0;i<8;i++) //for循环8次
  156. //  {
  157. //      OLED_SCLK_Set();    //时钟线置高,读取数据
  158. //      delay(1);   //延迟1us

  159. //      data <<= 1; //左移1位
  160. //      if(OLED_READ_SDIN())    //读取最高位
  161. //          data |= 0x01;   //读到高位位1
  162. //      else
  163. //          data &= 0xfe;   //读到高位为0

  164. //      OLED_SCLK_Clr();    //时钟线置低,准备读取下一个数据
  165. //      delay(1);   //延迟1us
  166. //  }

  167. //  IIC_Send_Ack(ack);  //发送应答/不应答

  168. //  return data;    //返回读取到的数据
  169. // }


  170. /*
  171.     @brief          IIC写入命令
  172.     @param          IIC_Command:写入的命令
  173.     @retval         无
  174. */
  175. static void Write_IIC_Command(unsigned char IIC_Command)
  176. {
  177.     OLED_IIC_Start();
  178.     Write_IIC_Byte(0x78);//写入从机地址,SD0 = 0
  179.     Write_IIC_Byte(0x00);//写入命令
  180.     Write_IIC_Byte(IIC_Command);//数据
  181.     OLED_IIC_Stop();  //发送停止信号
  182. }


  183. /*
  184.     @brief          IIC写入数据
  185.     @param          IIC_Data:数据
  186.     @retval         无
  187. */
  188. static void Write_IIC_Data(unsigned char IIC_Data)
  189. {
  190.     OLED_IIC_Start();
  191.     Write_IIC_Byte(0x78);    //写入从机地址,SD0 = 0
  192.     Write_IIC_Byte(0x40);    //写入数据
  193.     Write_IIC_Byte(IIC_Data);//数据
  194.     OLED_IIC_Stop();     //发送停止信号
  195. }


  196. /*
  197.     @brief          对OLED写入一个字节
  198.     @param          dat:数据
  199.                     cmd:1,写诶数据;0,写入命令
  200.     @retval         无
  201. */
  202. void OLED_WR_Byte(unsigned char dat, unsigned char cmd)
  203. {
  204.     if (cmd)
  205.     {
  206.         Write_IIC_Data(dat); //写入数据
  207.     }
  208.     else
  209.     {
  210.         Write_IIC_Command(dat); //写入命令
  211.     }
  212. }


  213. /*
  214.     @brief          设置数据写入的起始行、列
  215.     @param          x: 列的起始低地址与起始高地址;0x00~0x0f:设置起始列低地址(在页寻址模式);
  216.                         0x10~0x1f:设置起始列高地址(在页寻址模式)
  217.                     y:起始页地址 0~7
  218.     @retval         无
  219. */
  220. void OLED_Set_Pos(unsigned char x, unsigned char y)
  221. {
  222.     OLED_WR_Byte(0xb0 + y, OLED_CMD); //写入页地址
  223.     OLED_WR_Byte((x & 0x0f), OLED_CMD); //写入列的地址  低半字节
  224.     OLED_WR_Byte(((x & 0xf0) >> 4) | 0x10, OLED_CMD); //写入列的地址 高半字节
  225. }


  226. /*
  227.     @brief          开显示
  228.     @param          无
  229.     @retval         无
  230. */
  231. void OLED_Display_On(void)
  232. {
  233.     OLED_WR_Byte(0X8D, OLED_CMD); //设置OLED电荷泵
  234.     OLED_WR_Byte(0X14, OLED_CMD); //使能,开
  235.     OLED_WR_Byte(0XAF, OLED_CMD); //开显示
  236. }


  237. /*
  238.     @brief          关显示
  239.     @param          无
  240.     @retval         无
  241. */
  242. void OLED_Display_Off(void)
  243. {
  244.     OLED_WR_Byte(0XAE, OLED_CMD); //关显示
  245.     OLED_WR_Byte(0X8D, OLED_CMD); //设置OLED电荷泵
  246.     OLED_WR_Byte(0X10, OLED_CMD); //失能,关
  247. }


  248. /*
  249.     @brief          清屏
  250.     @param          无
  251.     @retval         无
  252. */
  253. void OLED_Clear(void)
  254. {
  255.     unsigned char i, n;         //定义变量
  256.     for (i = 0; i < 8; i++)
  257.     {
  258.         OLED_WR_Byte(0xb0 + i, OLED_CMD);  //从0~7页依次写入
  259.         OLED_WR_Byte(0x00, OLED_CMD);      //列低地址
  260.         OLED_WR_Byte(0x10, OLED_CMD);      //列高地址
  261.         for (n = 0; n < 128; n++)OLED_WR_Byte(0, OLED_DATA); //写入 0 清屏
  262.     }
  263. }


  264. /*
  265.     @brief          显示一个字符
  266.     @param          x:起始列
  267.                     y:起始页,SIZE = 16占两页;SIZE = 12占1页
  268.                     chr:字符
  269.     @retval         无
  270. */
  271. void OLED_ShowChar(unsigned char x, unsigned char y, unsigned char chr)
  272. {
  273.     unsigned char c = 0, i = 0;
  274.     c = chr - ' '; //获取字符的偏移量
  275.     if (x > Max_Column - 1)
  276.     {
  277.         x = 0;    //如果列数超出了范围,就从下2页的第0列开始
  278.         y = y + 2;
  279.     }

  280.     if (SIZE == 16) //字符大小如果为 16 = 8*16
  281.     {
  282.         OLED_Set_Pos(x, y); //从x y 开始画点
  283.         for (i = 0; i < 8; i++) //循环8次 占8列
  284.             OLED_WR_Byte(F8X16[c * 16 + i], OLED_DATA); //找出字符 c 的数组位置,先在第一页把列画完
  285.         OLED_Set_Pos(x, y + 1); //页数加1
  286.         for (i = 0; i < 8; i++) //循环8次
  287.             OLED_WR_Byte(F8X16[c * 16 + i + 8], OLED_DATA); //把第二页的列数画完
  288.     }
  289.     else    //字符大小为 6 = 6*8
  290.     {
  291.         OLED_Set_Pos(x, y + 1); //一页就可以画完
  292.         for (i = 0; i < 6; i++) //循环6次 ,占6列
  293.             OLED_WR_Byte(F6x8[c][i], OLED_DATA); //把字符画完
  294.     }
  295. }


  296. /*
  297.     @brief          计算m^n
  298.     @param          m:输入的一个数
  299.                     n:输入数的次方
  300.     @retval         result:一个数的n次方
  301. */
  302. unsigned int oled_pow(unsigned char m, unsigned char n)
  303. {
  304.     unsigned int result = 1;
  305.     while (n--)result *= m;
  306.     return result;
  307. }


  308. /*
  309.     @brief          在指定的位置,显示一个指定长度大小的数
  310.     @param          x:起始列
  311.                     y:起始页
  312.                     num:数字
  313.                     len:数字的长度
  314.                     size:显示数字的大小
  315.     @retval         无
  316. */
  317. void OLED_ShowNum(unsigned char x, unsigned char y, unsigned int num, unsigned char len, unsigned char size)
  318. {
  319.     unsigned char t, temp; //定义变量
  320.     unsigned char enshow = 0;   //定义变量

  321.     for (t = 0; t < len; t++)
  322.     {
  323.         temp = (num / oled_pow(10, len - t - 1)) % 10; //取出输入数的每个位,由高到低
  324.         if (enshow == 0 && t < (len - 1)) //enshow:是否为第一个数;t<(len-1):判断是否为最后一个数
  325.         {
  326.             if (temp == 0) //如果该数为0
  327.             {
  328.                 OLED_ShowChar(x + (size / 2)*t, y, ' '); //显示 0 ;x+(size2/2)*t根据字体大小偏移的列数(8)
  329.                 continue; //跳过剩下语句,继续重复循环(避免重复显示)
  330.             }
  331.             else enshow = 1;
  332.         }
  333.         OLED_ShowChar(x + (size / 2)*t, y, temp + '0'); //显示一个位;x+(size2/2)*t根据字体大小偏移的列数(8)
  334.     }
  335. }


  336. /*
  337.     @brief          显示字符串
  338.     @param          x:起始列
  339.                     y:起始页
  340.                     *chr:第一个字符首地址
  341.     @retval         无
  342. */
  343. void OLED_ShowString(unsigned char x, unsigned char y, unsigned char *chr)
  344. {
  345.     unsigned char j = 0; //定义变量

  346.     while (chr[j] != '\0') //如果不是最后一个字符
  347.     {
  348.         OLED_ShowChar(x, y, chr[j]); //显示字符
  349.         x += 8; //列数加8 ,一个字符的列数占8
  350.         if (x >= 128)
  351.         {
  352.             x = 0;    //如果x大于等于128,切换页,从该页的第一列显示
  353.             y += 2;
  354.         }
  355.         j++; //下一个字符
  356.     }
  357. }


  358. /*
  359.     @brief          显示中文
  360.     @param          x:起始列;一个字体占16列
  361.                     y:起始页;一个字体占两页
  362.                     no:字体的序号
  363.     @retval         无
  364. */
  365. void OLED_ShowCHinese(unsigned char x, unsigned char y, unsigned char no)
  366. {
  367.     unsigned char t, adder = 0; //定义变量

  368.     OLED_Set_Pos(x, y); //从 x y 开始画点,先画第一页
  369.     for (t = 0; t < 16; t++) //循环16次,画第一页的16列
  370.     {
  371.         OLED_WR_Byte(Hzk[2 * no][t], OLED_DATA); //画no在数组位置的第一页16列的点
  372.         adder += 1; //数组地址加1
  373.     }
  374.     OLED_Set_Pos(x, y + 1); //画第二页
  375.     for (t = 0; t < 16; t++) //循环16次,画第二页的16列
  376.     {
  377.         OLED_WR_Byte(Hzk[2 * no + 1][t], OLED_DATA); //画no在数组位置的第二页16列的点
  378.         adder += 1; //数组地址加1
  379.     }
  380. }


  381. /*
  382.     @brief          显示图片
  383.     @param          x0:起始列地址
  384.                     y0:起始页地址
  385.                     x1:终止列地址
  386.                     y1:终止页地址
  387.                     BMP[]:存放图片代码的数组
  388.     @retval         无
  389. */
  390. void OLED_DrawBMP(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned char BMP[])
  391. {
  392.     unsigned int j = 0; //定义变量
  393.     unsigned char x, y; //定义变量

  394.     if (y1 % 8 == 0) y = y1 / 8; //判断终止页是否为8的整数倍
  395.     else y = y1 / 8 + 1;

  396.     for (y = y0; y < y1; y++) //从起始页开始,画到终止页
  397.     {
  398.         OLED_Set_Pos(x0, y); //在页的起始列开始画
  399.         for (x = x0; x < x1; x++) //画x1 - x0 列
  400.         {
  401.             OLED_WR_Byte(BMP[j++], OLED_DATA);  //画图片的点
  402.         }
  403.     }
  404. }


  405. /*
  406.     @brief          OLED初始化函数
  407.     @param          无
  408.     @retval         无
  409. */
  410. void OLED_Init(void)
  411. {
  412.     OLED_GPIO_Init();   //GPIO口初始化

  413.     delay_ms(200);  //延迟,由于单片机上电初始化比OLED快,所以必须加上延迟,等待OLED上复位完成

  414.     OLED_WR_Byte(0xAE, OLED_CMD);   //关闭显示

  415.     OLED_WR_Byte(0x00, OLED_CMD);   //设置低列地址
  416.     OLED_WR_Byte(0x10, OLED_CMD);   //设置高列地址
  417.     OLED_WR_Byte(0x40, OLED_CMD);   //设置起始行地址
  418.     OLED_WR_Byte(0xB0, OLED_CMD);   //设置页地址

  419.     OLED_WR_Byte(0x81, OLED_CMD);   // 对比度设置,可设置亮度
  420.     OLED_WR_Byte(0xFF, OLED_CMD);   //  265

  421.     OLED_WR_Byte(0xA1, OLED_CMD);   //设置段(SEG)的起始映射地址;column的127地址是SEG0的地址
  422.     OLED_WR_Byte(0xA6, OLED_CMD);   //正常显示;0xa7逆显示

  423.     OLED_WR_Byte(0xA8, OLED_CMD);   //设置驱动路数(16~64)
  424.     OLED_WR_Byte(0x3F, OLED_CMD);   //64duty

  425.     OLED_WR_Byte(0xC8, OLED_CMD);   //重映射模式,COM[N-1]~COM0扫描

  426.     OLED_WR_Byte(0xD3, OLED_CMD);   //设置显示偏移
  427.     OLED_WR_Byte(0x00, OLED_CMD);   //无偏移

  428.     OLED_WR_Byte(0xD5, OLED_CMD);   //设置震荡器分频
  429.     OLED_WR_Byte(0x80, OLED_CMD);   //使用默认值

  430.     OLED_WR_Byte(0xD9, OLED_CMD);   //设置 Pre-Charge Period
  431.     OLED_WR_Byte(0xF1, OLED_CMD);   //使用官方推荐值

  432.     OLED_WR_Byte(0xDA, OLED_CMD);   //设置 com pin configuartion
  433.     OLED_WR_Byte(0x12, OLED_CMD);   //使用默认值

  434.     OLED_WR_Byte(0xDB, OLED_CMD);   //设置 Vcomh,可调节亮度(默认)
  435.     OLED_WR_Byte(0x40, OLED_CMD);   ////使用官方推荐值

  436.     OLED_WR_Byte(0x8D, OLED_CMD);   //设置OLED电荷泵
  437.     OLED_WR_Byte(0x14, OLED_CMD);   //开显示

  438.     OLED_WR_Byte(0xAF, OLED_CMD);   //开启OLED面板显示
  439.     OLED_Clear();        //清屏
  440.     OLED_Set_Pos(0, 0);  //设置数据写入的起始行、列
  441. }


  442. /*
  443.     @brief          OLED滚屏函数,范围0~1页,水平向左
  444.     @param          无
  445.     @retval         无
  446. */
  447. void OLED_Scroll(void)
  448. {
  449.     OLED_WR_Byte(0x2E, OLED_CMD);   //关闭滚动
  450.     OLED_WR_Byte(0x27, OLED_CMD);   //水平向左滚动
  451.     OLED_WR_Byte(0x00, OLED_CMD);   //虚拟字节
  452.     OLED_WR_Byte(0x00, OLED_CMD);   //起始页 0
  453.     OLED_WR_Byte(0x00, OLED_CMD);   //滚动时间间隔
  454.     OLED_WR_Byte(0x01, OLED_CMD);   //终止页 1
  455.     OLED_WR_Byte(0x00, OLED_CMD);   //虚拟字节
  456.     OLED_WR_Byte(0xFF, OLED_CMD);   //虚拟字节
  457.     OLED_WR_Byte(0x2F, OLED_CMD);   //开启滚动
  458. }
复制代码


  1. #ifndef __OLED__H
  2. #define __OLED__H


  3. #include "gd32e230.h"


  4. /*--------------------引脚定义--------------------------*/
  5. #define         OLED_SCLK_Set()         gpio_bit_set(GPIOB, GPIO_PIN_11)        //PB11(SCL)输出高
  6. #define         OLED_SCLK_Clr()         gpio_bit_reset(GPIOB,GPIO_PIN_11)       //PB11(SCL)输出低
  7. #define         OLED_SDIN_Set()         gpio_bit_set(GPIOB, GPIO_PIN_10)        //PB10(SDA)输出高
  8. #define         OLED_SDIN_Clr()         gpio_bit_reset(GPIOB, GPIO_PIN_10)      //PB10(SDA)输出高
  9. #define         OLED_READ_SDIN()        gpio_input_bit_get(GPIOB, GPIO_PIN_10)  //读取PB10(SDA)电平


  10. /*definition--------------------------------------------*/
  11. #define OLED_CMD  0 //写命令
  12. #define OLED_DATA 1 //写数据

  13. #define SIZE        16      //显示字符的大小
  14. #define Max_Column  128     //最大列数
  15. #define Max_Row     64      //最大行数
  16. #define X_WIDTH     128     //X轴的宽度
  17. #define Y_WIDTH     64      //Y轴的宽度                                    
  18. #define IIC_ACK     0       //应答
  19. #define IIC_NO_ACK  1       //不应答


  20. /*-----------------声明函数-----------------------------*/
  21. void OLED_WR_Byte(unsigned char dat, unsigned char cmd);  //OLED写字节函数
  22. void OLED_Display_On(void); //开显示函数
  23. void OLED_Display_Off(void);//关显示函数
  24. void OLED_Init(void);   //OLED初始化函数
  25. void OLED_Clear(void);  //清屏函数
  26. void OLED_ShowChar(unsigned char x, unsigned char y, unsigned char chr); //显示字符函数
  27. void OLED_ShowNum(unsigned char x, unsigned char y, unsigned int num, unsigned char len, unsigned char size2); //在指定的位置,显示一个指定数的长度大小函数
  28. void OLED_ShowString(unsigned char x, unsigned char y, unsigned char *p);    //在指定位置开始显示字符串函数
  29. void OLED_Set_Pos(unsigned char x, unsigned char y);        //画点函数
  30. void OLED_ShowCHinese(unsigned char x, unsigned char y, unsigned char no); //声明在指定位置显示汉字函数
  31. void OLED_DrawBMP(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned char BMP[]); //显示图片函数
  32. void OLED_Scroll(void); //滚动函数

  33. #endif
复制代码
  1. int main(void)
  2. {
  3.     systick_config();

  4.     /* initilize the com */
  5.     com_gpio_init();
  6.     com_usart_init();

  7.     OLED_Init();  //OLED初始化
  8.     OLED_Clear();

  9.     OLED_ShowString(30, 0, "EEWORLD");
  10.     OLED_ShowString(16, 2, "GD32E231C8T6");
  11.     OLED_ShowString(30, 4, "I2C Test");
  12.    
  13.     /* enable the LED1 GPIO clock */
  14.     rcu_periph_clock_enable(RCU_GPIOA);
  15.     /* configure LED1 GPIO port */
  16.     gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7);
  17.     gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
  18.     /* reset LED1 GPIO pin */
  19.     gpio_bit_reset(GPIOA, GPIO_PIN_7);

  20.     /* enable the LED2 GPIO clock */
  21.     /* configure LED2 GPIO port */
  22.     gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_8);
  23.     gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
  24.     /* reset LED2 GPIO pin */
  25.     gpio_bit_reset(GPIOA, GPIO_PIN_8);

  26.     /* enable the LED3 GPIO clock */
  27.     /* configure LED3 GPIO port */
  28.     gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_11);
  29.     gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_11);
  30.     /* reset LED3 GPIO pin */
  31.     gpio_bit_reset(GPIOA, GPIO_PIN_11);

  32.     /* enable the LED4 GPIO clock */
  33.     /* configure LED4 GPIO port */
  34.     gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_12);
  35.     gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12);
  36.     /* reset LED4 GPIO pin */
  37.     gpio_bit_reset(GPIOA, GPIO_PIN_12);

  38.     //shell.read = shellRead;
  39.     shell.write = shellprintchar;
  40.     shellInit(&shell);

  41.     while (1)
  42.     {
  43.     }
  44. }
复制代码

显示效果如下:

IMG_0129(1).JPG
此帖出自GD32 MCU论坛

回复

使用道具 举报

1246

TA的帖子

3

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2019-3-25 21:48 | 显示全部楼层
新的片子吗

点评

最新的CM23  详情 回复 发表于 2019-3-26 08:39

RTEMS


回复

使用道具 举报

1117

TA的帖子

1

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2019-3-26 08:39 | 显示全部楼层

最新的CM23

回复

使用道具 举报

247

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-4-27 21:56 | 显示全部楼层
你好 工程可以分享一下吗 谢谢了 2622918652@qq.om

回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2019-4-29 18:16 | 显示全部楼层
楼主,工程代码可以分享一下吗 十分感谢 406581695@qq.om

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/4 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-6-7 18:19 , Processed in 0.210175 second(s), 26 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表