[Cortex-M0技术交流] 【第三期】三生石的M0学习笔记第1贴--GPIO

[复制链接]
 楼主| kyzb001 发表于 2011-10-13 16:36 | 显示全部楼层 |阅读模式
本帖最后由 hotpower 于 2011-10-14 01:51 编辑

http://v.youku.com/v_show/id_XMzEyMzM5NTQ4.html

这个视频时 怎么测创建KEIL 的M0工程和NU-LINK+KEIL下载


串口和ISP的问题还没解决,所以先写了个GPIO的而调试方法就变成了蜂鸣器的响铃次数了。
对GPIO的操作主要就几个函数
1,int32_t DrvGPIO_Open(E_DRVGPIO_PORT port, int32_t i32Bit, E_DRVGPIO_IO mode)
这个函数主要是打开GPIO,并且设置GPIO的工作模式,输入输出等等。并且是直接对位进行操作
第一个变量时,端口。第二个变量时第几口,第三个是工作模式
2,int32_t DrvGPIO_Close(E_DRVGPIO_PORT port, int32_t i32Bit)
这个是关闭那个端口的第几个口。
3,int32_t DrvGPIO_ClrBit(E_DRVGPIO_PORT port, int32_t i32Bit)
这个函数为把那个端口的第几个口的电平拉低, 这个函数工作在IO口为OUTPUT的模式下
4,int32_t DrvGPIO_SetBit(E_DRVGPIO_PORT port, int32_t i32Bit)
这个函数为把那个端口的第几个口的电平拉高, 这个函数工作在IO口为OUTPUT的模式下
5,int32_t DrvGPIO_GetBit(E_DRVGPIO_PORT port, int32_t i32Bit)
这二个函数是取得端口电压
6,void DrvGPIO_EnableEINT0(E_DRVGPIO_INT_TYPE TriggerType, E_DRVGPIO_INT_MODE Mode, GPIO_EINT0_CALLBACK pfEINT0Callback)
看名字也知道 时能外部中断0
7,void DrvGPIO_DisableEINT0(void)
see name 关闭外部中断0
8,int32_t DrvGPIO_InitFunction(E_DRVGPIO_FUNC function)
设置IO口处于第几功能。  例如UART,SPI等, 如果使用这些功能就要进行相应的设置!


对GPIO的主要操作就是这些
如果我们要把一个IO口拉高,那么顺序就是
打开IO口并且设置为输出(Open函数)---->拉高IO口(SetBit函数)---->任务结束以后就(Close函数)。
如果我们要使用UART功能首先就要把GPIO的UART打开
DrvGPIO_InitFunction(E_FUNC_UART0);
相应的外部中断等等都是如此



  1. *本实验主要验证GPIO口的 输出,输入功能。 置高,置低。对GPIO进行基本的操作*/
  2. #include <stdio.h>
  3. #include "NUC1xx.h"
  4. #include "DrvGPIO.h"
  5. #include "DrvUART.h"
  6. #include "DrvSYS.h"

  7. #define SUCCESS 0xff
  8. #define FALI 0x00

  9. #define OPENBEEP DrvGPIO_SetBit(E_GPB,10)
  10. #define CLOSEBEEP DrvGPIO_ClrBit(E_GPB,10)
  11. /*
  12. typedef struct DRVUART_STRUCT
  13. {
  14. uint32_t u32BaudRate;
  15. E_DATABITS_SETTINS u8cDataBits;
  16. E_STOPBITS_SETTINS u8cStopBits;
  17. E_PARITY_SETTINS u8cParity;
  18. E_FIFO_SETTINGS u8cRxTriggerLevel;
  19. uint8_t u8TimeOut ;
  20. }STR_UART_T;
  21. */
  22. uint8_t DrvUART_Init(uint32_t band)
  23. {
  24. STR_UART_T param; //声明串口结构体,里面就是对串口操作的一些变量

  25. UNLOCKREG();
  26. SYSCLK->WRCON.XTL12M_EN=1; // 使能12M时钟
  27. DrvSYS_Delay(5000);
  28. DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC,0); //select IP clock source
  29. DrvGPIO_InitFunction(E_FUNC_UART0); //设置GPIO口为UART功能
  30. //Select UART configure
  31. param.u32BaudRate = band; //设置波特率为 115200
  32. param.u8cDataBits = DRVUART_DATABITS_8; //设置数据为8位
  33. param.u8cStopBits = DRVUART_STOPBITS_1; //停止位1位
  34. param.u8cParity = DRVUART_PARITY_NONE; //无效验码
  35. param.u8cRxTriggerLevel = DRVUART_FIFO_1BYTES; //Rx Trigger Leve 1 byte
  36. param.u8TimeOut = 0; //时间益处

  37. if(DrvUART_Open(UART_PORT0,¶m)==E_SUCCESS) //initialize UART0
  38. {
  39. return SUCCESS;
  40. }
  41. else
  42. return FALI;
  43. }
  44. //蜂鸣器初始化.
  45. //因为IO口初始化以后默认输出为高
  46. //所以初始化以后马上拉低IO口
  47. void DrvDeep_Init()
  48. {
  49. DrvGPIO_Open(E_GPB,10,E_IO_OUTPUT);
  50. DrvGPIO_ClrBit(E_GPB,10);
  51. }

  52. //连续响铃函数
  53. //u8Count为响铃的次数
  54. void DrvDeep_RingCount(uint8_t u8Count)
  55. {
  56. while(u8Count--)
  57. {
  58. OPENBEEP;
  59. DrvSYS_Delay(80000); //系统延时函数
  60. CLOSEBEEP;
  61. DrvSYS_Delay(80000);
  62. }
  63. }
  64. //主函数
  65. //注意要将GPA3和GPA4连接在一起, 不然实验没效果!
  66. //GPA3和GPA4在排针的最后一排二个。
  67. int main()
  68. {

  69. int32_t i32Err;
  70. DrvDeep_Init();

  71. if(DrvUART_Init(115200)==FALI) //打开串口。如果打开失败,响铃5下
  72. {
  73. DrvDeep_RingCount(5);
  74. }
  75. printf("\nSet UART0->UART0 is sucess\n"); //打开成功,打印消息
  76. printf("\n---------------------------\n");
  77. /*---------------------------------------------------------------------------------------------------------*/
  78. /* Basic Setting -----DrvGPIO_Open,DrvGPIO_SetBit,DrvGPIO_GetBit */
  79. /*---------------------------------------------------------------------------------------------------------*/
  80. DrvGPIO_Open(E_GPA,3,E_IO_OUTPUT); //GPA3设置成输出模式
  81. DrvGPIO_Open(E_GPA,4,E_IO_INPUT); //GPA4设置成输入模式

  82. DrvGPIO_ClrBit(E_GPA,3); //GPA3口拉低

  83. if(DrvGPIO_GetBit(E_GPA,4)==0 ) //检测GPA4口的电压,如果为第,证明GPA3口拉底成功!
  84. {
  85. printf("\nSet GPIO->SetBit is sucess\n");
  86. printf("\n GetBit is sucess\n");
  87. printf("\n DrvGPIO_Open is sucess\n");

  88. DrvDeep_RingCount(3); //响铃三下
  89. }
  90. /*---------------------------------------------------------------------------------------------------------*/
  91. /* Basic Setting -----DrvGPIO_ClrBit */
  92. /*---------------------------------------------------------------------------------------------------------*/
  93. DrvGPIO_SetBit(E_GPA,3); //GPA3拉高

  94. if(DrvGPIO_GetBit(E_GPA,4)==0) //检测GPA4口的电压,如果为高PA3口拉高成功!
  95. {
  96. printf("\n ClrBit is sucess for %d\n",DrvGPIO_GetBit(E_GPA,1));
  97. DrvDeep_RingCount(3);
  98. }
  99. while(1);

  100. }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
hotpower 发表于 2011-10-14 01:52 | 显示全部楼层
俺帮你改了,注意要用code
 楼主| kyzb001 发表于 2011-10-14 08:59 | 显示全部楼层
谢谢大叔!
我想用code来着。  狂点...就是点不出来....

对了  printf要注意咯。  如果项目很小的话,可以毫无顾忌的使用printf。
但是有一定量的画, 建议不要使用printf
564451696 发表于 2011-10-14 09:11 | 显示全部楼层
顶顶,你真快,俺休息玩玩玩。。。
 楼主| kyzb001 发表于 2011-10-14 12:03 | 显示全部楼层
顶顶,你真快,俺休息玩玩玩。。。
564451696 发表于 2011-10-14 09:11

嘿嘿!  那当然要速度...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:Is this my life

15

主题

624

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部