本帖最后由 啊哈young 于 2019-9-1 18:32 编辑

       以前用的比较多的是NXP的芯片或者STM的芯片,所以对这些库的函数都是比较了解的。但是这次是我第一次使用东芝的产品,也是第一次接触东芝的库函数。当打开例程的时候我是蒙蔽的,main.c文件里有很函数、程序。函数的命名都与之前接触的有所不同,函数的注释也都是英文的。所以写此文章针对于刚入门的小伙子。以下从常用函数名、程序流程介绍。

一、函数名
       对于刚入门的小白写程序,了解库函数的作用是最重要的,至于库函数的功能是如何实现的,需要了解寄存器后再去学习。

main.c文件中(以GPIO例程为例):

     bsp_initialize(); //对时钟、端口、中断进行初始化

     application_initialize();//应用初始化,即对当前程序所需要的引脚或功能进行初始化
     SystemCoreClockUpdate(); //获取系统时钟值
     SysTick_Config(period );//设置中断周期,该例程为10ms中断
     NVIC_EnableIRQ(SysTick_IRQn); //中断使能,即打开中断
     irq_systick();//中断请求,即10ms进入一次,执行该函数里的程序
     assert_failed(char *file, int32_t line);//断言,用于错误排查
GPIO.C文件中:
     TXZ_Result gpio_init(gpio_t *p_obj, uint32_t group);//引脚初始化,
     TXZ_Result gpio_deinit(gpio_t *p_obj, uint32_t group);//释放GPIO设置
     TXZ_Result gpio_write_mode(gpio_t *p_obj, uint32_t group, uint32_t mode, uint32_t val);//       对引脚进行写入模式设置
     TXZ_Result gpio_read_mode(gpio_t *p_obj, uint32_t group, uint32_t mode, uint32_t *val);//  对引脚进行读取模式设置
     TXZ_Result gpio_func(gpio_t *p_obj, gpio_gr_t group, gpio_num_t num, uint32_t func,gpio_pininout_t inout);//用于端口功能切换
     TXZ_Result gpio_SetPullUp(gpio_t *p_obj, gpio_gr_t group, gpio_num_t num,gpio_pinstate_t val);//设置引脚上拉
     TXZ_Result gpio_SetPullDown(gpio_t *p_obj, gpio_gr_t group, gpio_num_t num,gpio_pinstate_t val);//设置引脚下拉
     TXZ_Result gpio_SetOpenDrain(gpio_t *p_obj, gpio_gr_t group, gpio_num_t num,gpio_pinstate_t val);//设置引脚开漏
     TXZ_Result gpio_write_bit(gpio_t *p_obj, uint32_t group, uint32_t num, uint32_t mode,uint32_t val);//引脚位写入
     TXZ_Result gpio_read_bit(gpio_t *p_obj, uint32_t group, uint32_t num, uint32_t mode,gpio_pinstate_t *pinstate);//引脚位读取


ADC.C文件中:(用于数模转换)


     TXZ_Result adc_init(adc_t *p_obj);//adc模块初始化
     TXZ_Result adc_deinit(adc_t *p_obj);//释放adc模块
     TXZ_Result adc_channel_setting(adc_t *p_obj, uint32_t ch, adc_channel_setting_t *p_setting);//adc通道设置
     TXZ_Result adc_channel_clear(adc_t *p_obj, uint32_t ch);//清除adc通道设置
     TXZ_Result adc_cmp_init(adc_t *p_obj, adc_cmpx_t *p_cmpx_t);//用于adc比较
     TXZ_Result adc_cmp_deinit(adc_t *p_obj, adc_cmpx_t *p_cmpx_t);
     TXZ_Result adc_channel_get_value(adc_t *p_obj, uint32_t ch, uint32_t *p_value);获得adc通道值
     TXZ_Result adc_start(adc_t *p_obj);//adc功能开始
     TXZ_Result adc_stop(adc_t *p_obj);//adc功能结束


UART.C文件中:


     TXZ_Result uart_init(uart_t *p_obj);//串口模块初始化
     TXZ_Result uart_deinit(uart_t *p_obj);//释放串口模块
     TXZ_Result uart_discard_transmit(uart_t *p_obj);//放弃传输,即终止传输
     TXZ_Result uart_discard_receive(uart_t *p_obj);//放弃接受
     TXZ_Result uart_transmitIt(uart_t *p_obj, uart_transmit_t *p_info);//传输数据
     TXZ_Result uart_receiveIt(uart_t *p_obj, uart_receive_t *p_info);//接受数据
     void uart_transmit_irq_handler(uart_t *p_obj);//传输请求中断
     void uart_receive_irq_handler(uart_t *p_obj);//接受请求中断
     void uart_error_irq_handler(uart_t *p_obj);//错误中断
     TXZ_Result uart_get_status(uart_t *p_obj, uint32_t *p_status);//获取此时uart模块状态
     TXZ_Result uart_get_error(uart_t *p_obj, uint32_t *p_error);//获得错误信息
     TXZ_Result uart_get_boudrate_setting(uint32_t clock, uart_clock_t *p_clk, uint32_t boudrate, uart_boudrate_t *p_setting);//获取波特率


二、程序执行流程
   
  1. int main(void)
  2. {
  3.       uint32_t period;    // Period for SYSTICK
  4.     /*----------------------*/
  5.     /* BSP initialize       */
  6.     /*----------------------*/
  7.     bsp_initialize();
  8.     /*----------------------*/
  9.     /* Initialize           */
  10.     /*----------------------*/
  11.     /*--- application ---*/
  12.     if (application_initialize() != TXZ_SUCCESS)
  13.     {
  14.     }
  15.     /*----------------------*/
  16.     /* Main Processing      */
  17.     /*----------------------*/
  18.     /* Period for 10msec SYSTICK */
  19.     SystemCoreClockUpdate();
  20.     period = SystemCoreClock / 100;
  21.      
  22.     if (SysTick_Config(period ))    /* systick interrupt cycle setting */
  23.     {
  24.     }
  25.     NVIC_EnableIRQ(SysTick_IRQn);   /* systick interrupt enable */
  26.     /* dummy loop */
  27.     while (1){
  28.         __NOP();
  29.     }
  30. }
以上是主函数程序,一般小白都会在主函数里写程序,但是你会发现,主函数里除了初始化之外,并没有所要实现的功能函数。这里用到了中断。一般程序写在主函数,好处是不需要考虑程序结构、可读性强、易写。但会出现一些弊端,如没有准确的程序周期,不能充分利用等待时间等等,弊端很多,可以自行百度。当你开始使用中断写程序时,说明你的等级已经升级了。

可款芯片有很多中断,自己可以根据程序的重要性,进行中断优先级设置。以下是中断函数:
  1. void irq_systick(void)
  2. {
  3.   /*
  4.   ......
  5.   */
  6. }
其中写入中断执行程序。